只有 Button-1 在事件绑定 Tkinter 中有效

Only Button-1 Works in Event Bind 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 更改为其他任何内容,则不会发生任何事情。现在两个不同的矩形将在屏幕上移动。我正在尝试为矩形一设置一个绑定,为矩形二设置一个不同的键绑定。但是,我什至无法绑定到 Button-1 以外的任何东西。如果我将 Button-1 更改为 Button-2,什么也没有发生,我也尝试了 Return 和箭头键,但没有成功。

如果您在代码中将 <Button-1> 更改为 <Button-2>,则鼠标右键应该可以正常工作。可能会有一些奇怪的 platform-/version-specific 怪事,但由于对您的系统一无所知,我无法发表评论。

但是将其更改为 <Left> 行得通的。只有具有键盘焦点的 window 才会获取键盘事件。由于您没有任何文本输入类型的自动聚焦小部件,并且没有做任何事情来明确设置焦点,所以这就是您的 root.

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

  1. mainloop 之前调用 canvas.focus_set
  2. 调用 root.bind 而不是 canvas.bind

还有一件事需要注意:在许多 *nix 系统上,当您从终端 运行 一个 Tkinter 脚本时,它实际上并没有跳到前台。因此,在您单击 window.

上的某处之前,它不会接收键盘输入