26

我试图将左右箭头键绑定到 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()

为什么这不起作用?

4

4 回答 4

41

尝试绑定到您的主要变量:

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()
于 2013-11-10T22:20:48.533 回答
26

问题只是您绑定到的框架没有键盘焦点。当您按下键盘上的某个键时,该事件将发送到具有键盘焦点的小部件。默认情况下,框架没有键盘焦点。

将以下行添加到您的代码中以将键盘焦点移动到框架:

frame.focus_set()
于 2013-11-11T03:32:06.550 回答
2
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()
于 2017-02-07T09:38:40.707 回答
2

可能是您没有拦截正确的事件。数字小键盘上的箭头和其他箭头有不同的符号名称。

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

数字键盘上的名称前面带有“KP_”。

希望能帮助到你。如果不相关,请原谅新手:-)

于 2017-03-22T17:44:56.323 回答