我想将鼠标的双击事件绑定到一个函数上,目前该函数只会在 Tkinter 列表框中的项目被双击时打印当前选择。请问应该使用什么事件绑定?
我想将鼠标的双击事件绑定到一个函数上,目前该函数只会在 Tkinter 列表框中的项目被双击时打印当前选择。请问应该使用什么事件绑定?
<Double-Button-1>
:widget.bind('<Double-Button-1>', handler)
对于普通的鼠标点击,可以使用<Button-1>
,而三次鼠标点击则可以使用<Triple-Button-1>
。
有关Tkinter中绑定的更多信息,请参见事件和绑定。
Listbox
)开始,一直到 Tk()
或 Toplevel()
小部件。对于您来说,由于您只想在单击列表框项目时打印,因此可以像下面这样将其绑定到列表框小部件:listboxWidget.bind('<Double-Button-1>', listboxWidget_leftclick_handler)
当你进入 def listboxWidget_leftclick_handler(event)
函数时,不需要检查 event.widget
的值来确定它是否是你的 Listbox
小部件的名称。但是,你也可以在更高层级上进行检查(将处理程序绑定到更高级别的小部件),并检查 event.widget
来确定单击了哪个小部件。
还要注意的是,防止整个事件处理程序层次触发的唯一方法是通过使用 return 'break'
来自定义处理程序,但通常只有在后来的处理程序破坏了自定义处理程序所做的事情时才需要这样做。
关于默认处理程序的其他信息
我遗漏的另一部分是大多数事件也有一个“默认”处理程序。如果你绑定了自己的处理程序,在完成后,如果你没有使用 return 'break'
,则下一个默认处理程序将被调用。
例如,假设你想将自己的输入框转换为密码输入框。默认情况下,在输入框具有焦点(这意味着正在从键盘获取输入)时,输入字母数字字符将出现在 Entry
中。你可以绑定:
myEntry.bind('<KeyPress>', passworder)
这里的passworder
是你自定义的处理函数,它会获取包含你输入字符的事件并将星号输出到Entry
中。但是,如果你在处理函数结尾没有使用return "break"
,Entry
小部件仍然会看到你不想显示的字符,因为一旦你的处理程序完成插入星号操作,默认的处理程序就会简单地插入已键入的字符(像通常情况下一样)。但是,如果你使用了return 'break'
,默认的处理程序就不会被调用,键入的字符也就不会出现在Entry
中。
作为一个附加功能,为了区分单击和双击之间的动作,在调用鼠标动作前延迟一段时间,以允许设置双击标志。请参考下面的示例:
from tkinter import *
def mouse_click(event):
''' delay mouse action to allow for double click to occur
'''
aw.after(300, mouse_action, event)
def double_click(event):
''' set the double click status flag
'''
global double_click_flag
double_click_flag = True
def mouse_action(event):
global double_click_flag
if double_click_flag:
print('double mouse click event')
double_click_flag = False
else:
print('single mouse click event')
root = Tk()
aw = Canvas(root, width=200, height=100, bg='grey')
aw.place(x=0, y=0)
double_click_flag = False
aw.bind('<Button-1>', mouse_click) # bind left mouse click
aw.bind('<Double-1>', double_click) # bind double left clicks
aw.mainloop()