10

我一直在运行这样的小脚本

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)

一切正常。

所以,这真的让我很困惑。请任何人告诉我为什么会这样,在此先感谢。

4

3 回答 3

16

键绑定仅在具有键盘焦点的小部件获得键事件时触发。默认情况下,画布不会获得键盘焦点。您可以使用该focus_set方法对其进行重点关注。通常,您会在鼠标按钮的绑定中执行此操作。

将以下绑定添加到您的代码中,然后在画布中单击,您的键绑定将开始工作:

w.bind("<1>", lambda event: w.focus_set())
于 2013-03-07T12:15:39.690 回答
4

为了避免“单击画布以激活键绑定”,我在以下站点找到了更简单的代码:

http://ubuntuforums.org/showthread.php?t=1378609

他正在尝试绑定一个框架,但我在自己的代码中实现了它,并且画布小部件也可以工作。您的代码将如下所示:

w.focus_set()
w.bind(<Key>, callback)
于 2014-08-14T22:15:25.363 回答
2

tkinter 中有一个名为“Enter”的方便事件,它跟踪鼠标何时进入小部件。如果将它绑定到画布,并且在该事件的绑定回调中使用 canvas.focus_set,那么只要鼠标在画布上,您就会获得焦点,因此键盘绑定将起作用。

即使画布失去焦点(例如通过在另一个小部件中输入文本),这也会起作用,因为当鼠标再次进入画布时,它将重新获得焦点。

于 2017-12-25T19:33:13.293 回答