继承tk.Tk的App类无法使用主题布局,普通tk.Tk却正常
问题原因与解决办法
你这个问题的核心是组件创建和主题加载的顺序搞反了:
- 在类写法里,你先实例化
App类(同时创建了主窗口和Checkbutton),之后才加载并应用forest-light主题。此时创建Checkbutton时,ttk样式系统里还没有ToggleButton这个自定义布局,所以触发报错。 - 普通写法里,你先完成主题加载与应用,再创建Checkbutton,这时候主题里的
ToggleButton样式已经被注册,自然能正常运行。
解决办法1:在类实例化前加载主题
先临时创建一个Tk实例完成主题加载,再创建目标App实例:
import tkinter as tk from tkinter import ttk class App(tk.Tk): def __init__(self): super().__init__() ttk.Checkbutton(self, text="Checkbutton", style="ToggleButton").pack() # 先加载并应用主题 temp_root = tk.Tk() temp_root.tk.call('source', 'forest-light.tcl') ttk.Style().theme_use('forest-light') temp_root.destroy() # 再实例化自定义App类 root = App() root.mainloop()
解决办法2:把主题加载逻辑放到类初始化最前面
直接在App的__init__方法里先完成主题加载,再创建组件,这是更简洁的写法:
import tkinter as tk from tkinter import ttk class App(tk.Tk): def __init__(self): super().__init__() # 先加载并应用主题 self.tk.call('source', 'forest-light.tcl') ttk.Style().theme_use('forest-light') # 再创建需要使用主题样式的组件 ttk.Checkbutton(self, text="Checkbutton", style="ToggleButton").pack() root = App() root.mainloop()
调整顺序后,创建组件时主题已经生效,ToggleButton布局会被正确识别,不会再出现报错。
内容的提问来源于stack exchange,提问作者Simon Janssen
相关产品推荐
相关产品推荐

