Python中CustomTkinter框架类间共享动态变量roww的实现疑问
共享Frame间公共变量的解决方案
将公共变量roww托管在主控制器类中,让两个Frame通过控制器引用共享并修改该变量,是最清晰且易维护的实现方式。以下是针对你代码的具体修改:
1. 修改 gui.py
import customtkinter from frame_1 import Frame1 from frame_2 import Frame2 class YfinanceGUI(customtkinter.CTkFrame): def __init__(self, app): super().__init__(app) self.app = app self.roww = 0 # 在这里定义共享的公共变量,初始值为0 # 创建Frame时传递控制器引用 self.frame_1 = Frame1(self.app, self) self.frame_1.pack(padx=10, pady=10) self.frame_2 = Frame2(self.app, self.frame_1, self) self.frame_2.pack(padx=10, pady=10) self.print_button = customtkinter.CTkButton(master=self, command=self.print_row) self.print_button.pack(padx=10, pady=10) def print_row(self): print(f"Current row: {self.roww}") # 读取控制器中的roww app = customtkinter.CTk() running = YfinanceGUI(app) running.pack(fill="both", expand=True) # 确保主界面能显示 app.mainloop()
关键修正:
- 让
YfinanceGUI继承CTkFrame,解决内部按钮的父容器问题 - 将
roww作为控制器的实例属性,成为唯一的数据源 - 创建Frame时传入控制器引用,让子Frame能访问该变量
2. 修改 frame_1.py
import customtkinter class Frame1(customtkinter.CTkFrame): def __init__(self, master, controller, *args, **kwargs): super().__init__(master, *args, **kwargs) self.controller = controller # 保存控制器引用 # 读取控制器的roww来设置初始输入框的行 self.entry_1 = customtkinter.CTkEntry(self) self.entry_1.grid(row=1 + self.controller.roww, column=0, padx=10, pady=10) self.entry_2 = customtkinter.CTkEntry(self) self.entry_2.grid(row=1 + self.controller.roww, column=1, padx=10, pady=10)
3. 修改 frame_2.py
import customtkinter class Frame2(customtkinter.CTkFrame): def __init__(self, master, frame_1, controller, *args, **kwargs): super().__init__(master, *args, **kwargs) self.frame_1 = frame_1 self.controller = controller # 保存控制器引用 self.button = customtkinter.CTkButton(master=self, command=self.add_row) self.button.pack(padx=10, pady=10) def add_row(self): # 读取控制器的roww设置新输入框位置 self.entry_1 = customtkinter.CTkEntry(self.frame_1) self.entry_1.grid(row=1 + self.controller.roww, column=0, padx=10, pady=10) self.entry_2 = customtkinter.CTkEntry(self.frame_1) self.entry_2.grid(row=1 + self.controller.roww, column=1, padx=10, pady=10) self.controller.roww += 1 # 添加完成后更新共享变量
核心逻辑说明
- 所有对
roww的读取和修改都通过主控制器完成,确保变量唯一且同步 - 子Frame通过持有控制器引用实现共享,避免了全局变量的混乱
- 符合面向对象的封装原则,后续扩展功能时更容易维护
内容的提问来源于stack exchange,提问作者Ravdar
相关产品推荐
相关产品推荐

