繁体   English   中英

只有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更改为其他任何东西,则什么也不会发生。 现在,两个不同的矩形将在屏幕上移动。 我正在尝试为矩形1设置一个绑定,为矩形2设置一个不同的键绑定。 但是,我什至似乎无法绑定到Button-1以外的任何东西。 如果我将Button-1更改为Button-2,则什么也没有发生,因此我也尝试过Return键和箭头键,但没有运气。

如果在代码中将<Button-1>更改为<Button-2> ,则鼠标右键应该可以正常工作。 可能存在一些奇怪的特定于平台/版本的奇怪之处,但是在不了解您的系统的情况下,我无法发表评论。

但是,将其更改为,例如, <Left>行不通的。 只有具有键盘焦点的窗口才能获取键盘事件。 而且,由于您没有任何文本输入类型的自动聚焦小部件,并且没有做任何事情来显式设置焦点,因此这就是您的root

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

  1. 呼叫canvas.focus_set前右mainloop
  2. 调用root.bind而不是canvas.bind

需要注意的另一件事:在许多* nix系统上,当您从终端运行Tkinter脚本时,它实际上并没有跳到前台。 因此,只有单击窗口中的某个位置,它才会接收键盘输入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM