Python:在不涉及鼠标的任何事情上使用.bind()时遇到问题

时间:2015-04-02 22:02:09

标签: python canvas bind

我可以像这样制作一个基本的python应用程序:

from tkinter import *

block = None

def moveUp(event):
    field.move(block,0,-50)

root = Tk()

field = Canvas(root, width = 300, height = 300, bg = 'light blue')
field.pack()


block = field.create_rectangle(100,100,110,110)

field.bind('<Button-1>',moveUp)

mainloop()

它的行为就像你期望的那样。它在Canvas上创建一个正方形,并在每次单击Canvas时将该正方形移动50个像素。

然而,当我更换

field.bind('<Button-1>',moveUp)

,例如,

field.bind('<Return>',moveUp)

无论我按下回车键多少次,广场都不会移动。对于任何类型的键盘输入(例如<space>等),此问题仍然存在,但任何涉及鼠标的输入都可以。

任何输入都表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

field没有焦点,因此无法捕获按键。一种选择只是使绑定更通用:

field.bind('<Return>',moveUp)

root.bind('<Return>',moveUp)

另一种选择是将焦点设置为field

field.bind('<Return>',moveUp)
field.focus_set()

答案 1 :(得分:0)

不完全确定原因是什么,但如果您使用bind_all代替bind,它似乎有效。

field.bind_all('<Return>',moveUp)

我的猜测是使用键盘,画布没有焦点,所以没有注册事件。使用bind_all,当应用程序的任何窗口小部件具有焦点时,将注册该事件。

有关levels of binding的一些信息,请参阅此处。