使用Tkinter的bind_all方法时如何为部分控件设置触发例外
Tkinter bind_all 方法设置控件触发例外的实现方案
bind_all 触发时回调函数的 event.widget 参数会直接返回触发事件的控件包装器实例,不需要解析 winfo_parent() 返回的路径字符串,基于这个特性可以很方便实现例外判断。
方案1:维护例外控件集合
把不需要触发 bind_all 回调的控件统一存入列表/集合,回调时先判断触发控件是否在例外集合中,是则直接终止执行。适合集中管理所有例外控件的场景,调整例外范围只需修改集合内容即可。
修改后的完整代码如下:
from tkinter import * class Example(Frame): def __init__(self, master, *args, **kwargs): super().__init__(master, *args, **kwargs) self.frame = Frame(self, bg='yellow') self.frame.pack(side=TOP, fill=BOTH) self.cnt = Frame(self.frame, bg='green2') self.cnt.pack(side=TOP, fill=BOTH) self.btn = Button(self.cnt, text='Button 1 ') self.btn.pack() self.btn2 = Button(self.cnt, text='Button 2') self.btn2.pack() # 定义不需要触发回调的例外控件列表,可任意添加多个控件 self.except_widgets = [self.btn] self.bind_all('<Motion-1>', self.hellow) def hellow(self, event): # 触发控件属于例外列表则直接返回,不执行后续逻辑 if event.widget in self.except_widgets: return print('I always run how I want') root = Tk() app = Example(root) app.pack(side=TOP, fill=BOTH) root.mainloop()
方案2:给例外控件添加自定义标记属性
给不需要触发回调的控件自定义一个专属属性作为标记,回调时检查控件是否带有该标记即可。不需要额外维护集合,创建控件时直接标记即可,适合分散创建控件的场景。
示例核心修改点:
# 初始化时给不需要触发的控件加标记 self.btn.skip_global_bind = True def hellow(self, event): if hasattr(event.widget, 'skip_global_bind'): return print('I always run how I want')
如果你需要对某个容器下的所有控件统一设置例外,直接通过控件的 master 属性判断父容器实例即可,不需要解析路径字符串:
# 所有父容器为 self.cnt 的控件都不触发回调 if event.widget.master == self.cnt: return
内容的提问来源于stack exchange,提问作者Jackie Ck
相关产品推荐
相关产品推荐

