web-dev-qa-db-fra.com

Tkinter - Impossible de lier les événements de touches fléchées

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?

20
aftrumpet

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()
29
Fiver

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()
18
Bryan Oakley
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()
1
mc diamond 144

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 :-)

1
Claude