CustomTkinter跨类TabView组件与OK按钮状态控制实现问询
解决方案
方法一:通过父实例直接访问(简单直接)
在MyTabView的初始化方法中保存传入的App实例引用,后续直接通过该引用操作全局OK按钮:
import customtkinter as ctk class MyTabView(ctk.CTkTabview): def __init__(self, master, **kwargs): super().__init__(master, **kwargs) self.app = master # 保存App实例引用 self.add('tab 1') self.Entry = ctk.CTkOptionMenu(master=self.tab('tab 1'), values=['', 'Yes', 'No'], command=self.Entry_Done) self.Entry.grid(row=0, column=0, padx=20, pady=10) def Entry_Done(self, *_args): # 先执行自定义操作 print("选项已修改,执行前置逻辑") # 启用OK按钮 self.app.OKButton.configure(state='normal') class App(ctk.CTk): def __init__(self): super().__init__() self.tab_view = MyTabView(master=self) self.tab_view.grid(row=0, column=0, padx=20, pady=20) self.OKButton = ctk.CTkButton(self, text='OK', state='disabled') self.OKButton.grid(row=3, column=1, columnspan=1, padx=20, pady=20, sticky='ew') app = App() app.mainloop()
方法二:通过回调解耦(更优雅)
如果希望TabView组件不直接依赖App的内部属性,可在初始化TabView时传入回调函数,完成自定义操作后触发回调启用按钮:
import customtkinter as ctk class MyTabView(ctk.CTkTabview): def __init__(self, master, on_modified, **kwargs): super().__init__(master, **kwargs) self.on_modified = on_modified # 保存回调函数 self.add('tab 1') self.Entry = ctk.CTkOptionMenu(master=self.tab('tab 1'), values=['', 'Yes', 'No'], command=self.Do_Stuff) self.Entry.grid(row=0, column=0, padx=20, pady=10) def Do_Stuff(self, *_args): # 执行自定义操作 print("完成前置业务逻辑") # 触发回调启用按钮 self.on_modified() class App(ctk.CTk): def __init__(self): super().__init__() # 初始化TabView时传入回调方法 self.tab_view = MyTabView(master=self, on_modified=self.enable_ok_button) self.tab_view.grid(row=0, column=0, padx=20, pady=20) self.OKButton = ctk.CTkButton(self, text='OK', state='disabled') self.OKButton.grid(row=3, column=1, columnspan=1, padx=20, pady=20, sticky='ew') def enable_ok_button(self): self.OKButton.configure(state='normal') app = App() app.mainloop()
关键说明
- 方法一中,
self.app就是App类的实例,因为初始化TabView时传入的master=self指向App自身 - 方法二中的回调方式避免了类之间的强依赖,更利于后续代码维护和功能扩展
内容的提问来源于stack exchange,提问作者Andrew Eaves
相关产品推荐
相关产品推荐

