如何在Tkinter中为所有Button类型组件全局绑定回调函数
方案1:类级别绑定(最简便,全应用生效)
Tkinter原生提供bind_class方法,可直接为指定类型的所有组件批量绑定事件,完全不需要为每个Button单独写绑定逻辑。
你只需要删除所有Frame里Button实例的单独bind代码,在Controller的初始化方法中添加两行类绑定代码即可:
# 给所有Button类实例绑定按下和松开事件 self.bind_class("Button", "<ButtonPress>", self.press) self.bind_class("Button", "<ButtonRelease>", self.release)
修改后的完整可运行代码如下:
import tkinter as tk from tkinter import Frame, Button, Tk class Frame_1(Frame): def __init__(self,master, **kwargs): super().__init__(master, **kwargs) self.btn_0 = Button(self, text='Press 10') self.btn_0.pack() # 已删除单独绑定代码 class Frame_2(Frame): def __init__(self,master, **kwargs): super().__init__(master, **kwargs) self.btn_0 = Button(self, text='Press 10') self.btn_0.pack() # 已删除单独绑定代码 class Controller(Frame): def __init__(self,master, **kwargs): super().__init__(master, **kwargs) self.frm1 = Frame_1(self, bg='blue') self.frm1.pack() self.frm2 = Frame_2(self, bg='green') self.frm2.pack() # 新增全局Button类绑定 self.bind_class("Button", "<ButtonPress>", self.press) self.bind_class("Button", "<ButtonRelease>", self.release) def press(self, e): print('press') def release(self, e): print('release') root=Tk() app=Controller(root) app.pack() root.mainloop()
方案2:范围绑定(仅作用于当前容器下的Button)
如果你的应用有其他模块的Button不需要绑定这两个事件,可以用递归遍历子组件的方式,只给当前Controller下的所有Button绑定:
在Controller中新增遍历绑定方法,初始化完成所有子组件后调用即可:
class Controller(Frame): def __init__(self,master, **kwargs): super().__init__(master, **kwargs) self.frm1 = Frame_1(self, bg='blue') self.frm1.pack() self.frm2 = Frame_2(self, bg='green') self.frm2.pack() # 调用遍历绑定方法 self.bind_all_buttons(self) # 新增递归绑定方法 def bind_all_buttons(self, widget): for child in widget.winfo_children(): if isinstance(child, Button): child.bind('<ButtonPress>', self.press) child.bind('<ButtonRelease>', self.release) # 递归遍历子容器内的组件 else: self.bind_all_buttons(child) def press(self, e): print('press') def release(self, e): print('release')
内容的提问来源于stack exchange,提问作者CandyGlow
相关产品推荐
相关产品推荐

