为何<Button-1>与<ButtonPress>绑定无法同时触发?
问题原因与解决方法
原因
tkinter的事件绑定遵循精确匹配规则:
<Button-1>是<ButtonPress-1>的简写,对应鼠标左键按下的具体事件;- 单纯的
<ButtonPress>事件模式,无法匹配带具体按键编号的<ButtonPress-1>事件,它仅会响应未指定具体按键的ButtonPress事件(部分环境中仅触发非左键的按键操作); - 你绑定的两个逻辑实际上对应不同事件,因此左键按下时只会触发
<Button-1>的处理函数,看起来像是被覆盖,本质是事件不匹配。
解决方法
提供两种可行方案:
方案一:绑定同一左键事件
将第二个绑定的事件改为<Button-1>(或<ButtonPress-1>),借助add='+'参数添加第二个处理函数,确保两个逻辑都在左键按下时执行:
import tkinter as tk root = tk.Tk() root.bind('<Button-1>', lambda e: print('b-1'), add='+') root.bind('<Button-1>', lambda e: print('some button'), add='+') root.mainloop()
方案二:绑定通用鼠标按下事件
如果希望<ButtonPress>的处理函数响应所有鼠标按键按下(包括左键),直接使用<ButtonPress>不带参数,也可以通过事件对象的num属性判断具体按键:
import tkinter as tk root = tk.Tk() root.bind('<Button-1>', lambda e: print('b-1'), add='+') # 响应所有鼠标按键按下,e.num可获取按键编号(1=左键,2=中键,3=右键) root.bind('<ButtonPress>', lambda e: print(f'some button: {e.num}'), add='+') root.mainloop()
内容的提问来源于stack exchange,提问作者Danya K
相关产品推荐
相关产品推荐

