只有 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
拥有整个根并且任何地方都没有其他小部件),我认为它们之间不会有太大区别。
- 在
mainloop
之前调用 canvas.focus_set
。
- 调用
root.bind
而不是 canvas.bind
。
还有一件事需要注意:在许多 *nix 系统上,当您从终端 运行 一个 Tkinter 脚本时,它实际上并没有跳到前台。因此,在您单击 window.
上的某处之前,它不会接收键盘输入
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
拥有整个根并且任何地方都没有其他小部件),我认为它们之间不会有太大区别。
- 在
mainloop
之前调用canvas.focus_set
。 - 调用
root.bind
而不是canvas.bind
。
还有一件事需要注意:在许多 *nix 系统上,当您从终端 运行 一个 Tkinter 脚本时,它实际上并没有跳到前台。因此,在您单击 window.
上的某处之前,它不会接收键盘输入