J'essaie de lier les touches fléchées gauche et droite à un événement dans Tkinter, mais lorsque j'exécute le programme, il semble que les événements ne se déclenchent pas. Voici le code:
from Tkinter import *
main = Tk()
def leftKey(event):
print "Left key pressed"
def rightKey(event):
print "Right key pressed"
frame = Frame(main, width=100, height=100)
frame.bind('<Left>', leftKey)
frame.bind('<Right>', rightKey)
frame.pack()
frame.mainloop()
Pourquoi ça ne marche pas?
Essayez de lier à votre variable principale:
from Tkinter import *
main = Tk()
def leftKey(event):
print "Left key pressed"
def rightKey(event):
print "Right key pressed"
frame = Frame(main, width=100, height=100)
main.bind('<Left>', leftKey)
main.bind('<Right>', rightKey)
frame.pack()
main.mainloop()
Je dois expliquer que cela fonctionne car Tk est informé des liaisons car la fenêtre principale a le focus clavier. Comme l'explique la réponse de @ BryanOakley, vous pouvez également définir le focus du clavier sur l'autre image:
from Tkinter import *
main = Tk()
def leftKey(event):
print "Left key pressed"
def rightKey(event):
print "Right key pressed"
frame = Frame(main, width=100, height=100)
frame.bind('<Left>', leftKey)
frame.bind('<Right>', rightKey)
frame.focus_set()
frame.pack()
main.mainloop()
En savoir plus sur événements et liaisons sur effbot .
Vous pouvez également réécrire ceci afin que votre application soit une sous-classe de Tkinter.Frame
ainsi:
import Tkinter
class Application(Tkinter.Frame):
def __init__(self, master):
Tkinter.Frame.__init__(self, master)
self.master.minsize(width=100, height=100)
self.master.config()
self.master.bind('<Left>', self.left_key)
self.master.bind('<Right>', self.right_key)
self.main_frame = Tkinter.Frame()
self.main_frame.pack(fill='both', expand=True)
self.pack()
@staticmethod
def left_key(event):
print event + " key pressed"
@staticmethod
def right_key(event):
print event + " key pressed"
root = Tkinter.Tk()
app = Application(root)
app.mainloop()
Le problème est simplement que le cadre auquel vous liez n'a pas le focus du clavier. Lorsque vous appuyez sur une touche du clavier, l'événement est envoyé au widget avec le focus clavier. Par défaut, un cadre n'a pas le focus clavier.
Ajoutez la ligne suivante à votre code pour déplacer le focus du clavier sur le cadre:
frame.focus_set()
from tkinter import *
def leftKey(event):
print("Left key pressed")
def rightKey(event):
print("Right key pressed")
main = Tk()
frame = Frame(main, width=100, height=100)
main.bind('<Left>', leftKey)
main.bind('<Right>', rightKey)
frame.pack()
main.mainloop()
Il se peut que vous n'interceptiez pas les bons événements. Les flèches du pavé numérique et les autres ont des noms symboliques différents.
Voir http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/key-names.html
ceux sur le pavé numérique sont nommés avec un 'KP_' devant.
J'espère que cela aide. Pardonnez un débutant s'il n'est pas pertinent :-)