Python Tkinter 画布无法绑定键盘

12 投票
3 回答
14632 浏览
提问于 2025-04-17 18:15

我一直在运行一个像这样的简单脚本:

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

不过,在我的情况下,键盘事件没有被处理(我在Windows 7上使用Python 2.7)。

如果我使用:

w.bind("<Button-1>", callback)

一切都正常。

所以,这让我很困惑。请问谁能告诉我这是为什么,提前谢谢大家。

3 个回答

2

在tkinter中,有一个很方便的事件叫做“Enter”,它可以追踪鼠标什么时候进入一个控件。如果你把这个事件绑定到画布上,并在这个事件的回调函数中使用canvas.focus_set,那么每当鼠标在画布上时,画布就会获得焦点,这样键盘的操作就能正常工作了。

即使画布失去了焦点(比如你在其他控件中输入文字),这个方法依然有效,因为当鼠标再次进入画布时,它会重新获得焦点。

4

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

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

他在尝试绑定一个框架,但我把它应用到了自己的代码中,画布小部件也能正常工作。你的代码看起来会像下面这样:

w.focus_set()
w.bind(<Key>, callback)
19

键盘快捷键只有在当前有键盘焦点的控件接收到按键事件时才会触发。默认情况下,画布是不会获得键盘焦点的。你可以通过使用 focus_set 方法来让它获得焦点。通常,你会在鼠标点击的事件中设置这个焦点。

把下面的绑定代码加到你的程序里,然后点击画布,你的键盘快捷键就可以开始工作了:

w.bind("<1>", lambda event: w.focus_set())

撰写回答