Tkinter - Невозможно связать события со стрелкой

Я пытаюсь связать клавиши со стрелками влево и вправо с событием в Tkinter, но когда я запускаю программу, это означает, что события не запускаются. Вот код:

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

Почему это не работает?

Ответ 1

Попробуйте привязать к основной переменной:

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

Я должен объяснить, что это работает, потому что Tk получает информацию о привязках, потому что главное окно имеет фокус клавиатуры. Как объяснил @BryanOakley ответ, вы также можете просто настроить фокус клавиатуры на другой кадр:

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

Подробнее о событиях и привязках в effbot.

Кроме того, вы также можете перезаписать его, чтобы ваше приложение было подклассом Tkinter.Frame следующим образом:

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

Ответ 2

Проблема заключается только в том, что фрейм, на который вы привязаны, не имеет фокуса клавиатуры. Когда вы нажимаете клавишу на клавиатуре, событие отправляется в виджет с фокусом клавиатуры. По умолчанию кадр не имеет фокуса клавиатуры.

Добавьте в свой код следующую строку, чтобы переместить фокус клавиатуры в рамку:

frame.focus_set()

Ответ 3

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

Ответ 4

Возможно, вы не перехватите правильные события. Стрелки на цифровой клавиатуре и другие имеют разные символические имена.

См. http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/key-names.html

те, что на цифровой клавиатуре, называются с "KP_" спереди.

Надеюсь, это поможет. Простите новичку, если не уместно: -)