只有Button-1在Event Bind Tkinter中工作

时间:2015-05-06 03:17:06

标签: python tkinter

from Tkinter import *

root = Tk()

canvas = Canvas(root, width = 300, height = 300)
canvas.pack()

one = canvas.create_rectangle(100, 100, 500, 500, fill = 'red')
two = canvas.create_rectangle(200, 200, 500, 500, fill = 'green')



def move_rectangle(canvas, one):
    canvas.move(one, 2, 3)
    canvas.move(two,4,5)

def callback(event):
    move_rectangle(canvas, one)
    move_rectangle(canvas, two)


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

canvas.pack(expand = YES, fill = BOTH)

mainloop()

如果我将Button-1更改为其他任何内容,则不会发生任何事情。现在,两个不同的矩形将在屏幕上移动。我正在尝试为矩形1设置绑定,为矩形2设置不同的键绑定。但是,我甚至无法绑定除Button-1以外的任何东西。如果我将Button-1更改为Button-2没有任何反应,我也尝试了Return和箭头键,没有运气。

1 个答案:

答案 0 :(得分:1)

如果您在代码中将<Button-1>更改为<Button-2>,则鼠标右键应该可以正常工作。可能有一些奇怪的平台/版本特有的奇怪,但不知道你的系统,我不能发表评论。

但是将其更改为例如<Left> 将起作用。只有具有键盘焦点的窗口才能获得键盘事件。由于您没有任何文本输入类型的自动聚焦小部件,并且没有做任何明确设置焦点的事情,那就是您的root

所以,有两个修复。任何一个都可以工作,并且在你的特定情况下(Canvas拥有整个根,并且在任何地方都没有其他小部件),我不认为它们之间会有太大的区别。

  1. canvas.focus_set之前致电mainloop
  2. 致电root.bind而非canvas.bind
  3. 需要注意的另一件事是:在许多* nix系统上,当您从终端运行Tkinter脚本时,它实际上并没有跳转到前台。因此,在您单击窗口某处之前,它不会接收键盘输入。