[英]Python tkinter listbox bind on <Button-1> only works on second click
[英]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更改为其他任何东西,则什么也不会发生。 现在,两个不同的矩形将在屏幕上移动。 我正在尝试为矩形1设置一个绑定,为矩形2设置一个不同的键绑定。 但是,我什至似乎无法绑定到Button-1以外的任何东西。 如果我将Button-1更改为Button-2,则什么也没有发生,因此我也尝试过Return键和箭头键,但没有运气。
如果在代码中将<Button-1>
更改为<Button-2>
,则鼠标右键应该可以正常工作。 可能存在一些奇怪的特定于平台/版本的奇怪之处,但是在不了解您的系统的情况下,我无法发表评论。
但是,将其更改为,例如, <Left>
是行不通的。 只有具有键盘焦点的窗口才能获取键盘事件。 而且,由于您没有任何文本输入类型的自动聚焦小部件,并且没有做任何事情来显式设置焦点,因此这就是您的root
。
因此,有两个修复程序。 两种方法都可以使用,在您的特殊情况下( Canvas
拥有整个根,而其他任何地方都没有其他小部件),我认为它们之间不会有太大的区别。
canvas.focus_set
前右mainloop
。 root.bind
而不是canvas.bind
。 需要注意的另一件事:在许多* nix系统上,当您从终端运行Tkinter脚本时,它实际上并没有跳到前台。 因此,只有单击窗口中的某个位置,它才会接收键盘输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.