我一直在运行这样的小脚本
from Tkinter import *
root = Tk()
def callback(event):
print "callback"
w = Canvas(root, width=300, height=300)
w.bind("<Key>", callback)
w.pack()
root.mainloop()
但是,在我的情况下不处理键盘事件(我在窗口7上使用python 2.7)
如果我使用
w.bind("<Button-1>", callback)
事情很好。
所以,这真让我困惑。请有人告诉我为什么会这样,提前谢谢。
仅当具有键盘焦点的窗口小部件获得键事件时,才会触发键绑定。默认情况下,画布不会获得键盘焦点。您可以使用focus_set
方法重点关注它。通常,您可以在鼠标按钮上进行绑定。
将以下绑定添加到您的代码中,然后在画布中单击,您的键绑定将开始工作:
w.bind("<1>", lambda event: w.focus_set())
为了避免“单击画布以激活键绑定”,我在以下站点找到了更简单的代码:
http://ubuntuforums.org/showthread.php?t=1378609
他试图绑定一个框架,但我在自己的代码中实现了它,并且canvas小部件也可以工作。您的代码如下所示:
w.focus_set()
w.bind(<Key>, callback)
在tkinter中有一个名为“Enter”的便捷事件,用于跟踪鼠标何时进入窗口小部件。如果将它绑定到画布,并且在该事件的绑定回调中使用canvas.focus_set,那么只要鼠标位于画布上,您就会有焦点,因此键盘绑定将起作用。
即使画布失去焦点(例如通过在另一个小部件中输入文本),这也会起作用,因为当鼠标再次进入画布时,它将重新获得焦点。