Tkinter中如何通过容器类从父类获取实例变量
问题原因
color_widget是定义在MainApplication.__init__方法内的实例属性,只有MainApplication类实例化之后才会存在,且仅绑定到对应的实例对象。你直接用MainApplication.color_widget的写法是尝试访问类级别的静态属性,当然无法拿到对应的值。
另外你代码里tk.Label的参数写错了:tkinter组件的字体颜色参数名是fg(全称为foreground),直接传color参数运行会抛出异常。
可行实现方案
方案1:通过tkinter内置方法获取顶层主窗口实例(改造成本最低)
tkinter所有可视化控件都自带winfo_toplevel()方法,可以沿着控件嵌套链直接找到最顶层的主窗口实例,不需要修改现有Page类的初始化传参逻辑,直接修改Page类内的取值逻辑即可:
class Page1(ttk.Frame): def __init__(self, container): super().__init__(container) # 获取当前控件所属的顶层主窗口实例 main_app = self.winfo_toplevel() color = main_app.color_widget # 注意修正Label的颜色参数为fg self.label_INPUT = tk.Label(self, text='Settings', fg=color) self.label_INPUT.place(relx=0.03, rely=0.04)
所有Page类都可以用这个写法拿到主类的任意实例属性。
方案2:初始化Page时显式传入主类实例(结构更清晰)
如果项目逻辑复杂,想要明确类之间的依赖关系,可以在创建Page对象的时候手动把主类实例传进去:
首先修改MainApplication中创建Page的代码:
class MainApplication(tk.Tk): def __init__(self): super().__init__() self.color_widget = '#1B608E' self.notebook = ttk.Notebook(self) # 创建Page时把当前主类实例self作为参数传入 self.Page1 = Page1(self.notebook, self) self.Page2 = Page2(self.notebook, self) self.notebook.add(self.Page1, text='PCE Franchisés') self.notebook.add(self.Page2, text='PVC Franchisés')
再修改两个Page类的初始化方法,接收传入的主类实例:
class Page1(ttk.Frame): def __init__(self, container, main_app): super().__init__(container) color = main_app.color_widget self.label_INPUT = tk.Label(self, text='Settings', fg=color) self.label_INPUT.place(relx=0.03, rely=0.04) class Page2(ttk.Frame): def __init__(self, container, main_app): super().__init__(container) # 后续需要访问主类属性直接通过main_app取值即可
方案3:将固定配置定义为类属性
如果color_widget是全局固定的UI配置值,不会根据实例动态变化,也可以直接把它定义为MainApplication的类属性,这时候你最初写的MainApplication.color_widget就可以直接生效:
class MainApplication(tk.Tk): # 类属性,所有MainApplication实例共享 color_widget = '#1B608E' def __init__(self): super().__init__() # 其余原有逻辑不需要修改
内容的提问来源于stack exchange,提问作者Malou
相关产品推荐
相关产品推荐

