ttkthemes应用于root时无法主题化整个窗口的问题求助
ttkthemes主题无法覆盖整个窗口的问题解决
我在ttkthemes中尝试了各类主题,将其应用于root/self后,仅能对文本、按钮进行主题化,无法覆盖整个窗口。原本期望主题能铺满整个窗口,是否遗漏了某些设置?

问题代码:
class Window(ThemedTk): def __init__(self): ThemedTk.__init__(self) self.tk.call('lappend', 'auto_path', 'correct_path_to_theme') self.tk.call('package', 'require', 'awdark') s = ttk.Style() s.theme_use("awdark") # frame all content will sit inside of mainframe = ttk.Frame(self, width=self.width, height=self.height) mainframe.pack(side="top", fill="both", expand=True) self.frames = {} for F in ( HomePage, ): frame = F(mainframe, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame(HomePage) def show_frame(self, fr): frame = self.frames[fr] frame.tkraise() # Home Page of the app class HomePage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) # header label header_label = ttk.Label( self, text="Post Visual Inspection Board Capture Program", justify="center" ) header_label.pack() # will start the new capture process new_capture_buton = ttk.Button( self, text="New Capture", command=lambda: controller.show_frame(InstructionsPage), ) new_capture_buton.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
解决方法:
- 核心问题:
HomePage继承的是tk.Frame而非ttk.Frame,普通tk组件不会应用ttk主题的背景样式,导致空白区域无法被主题覆盖。 - 简化主题加载:
ThemedTk已经封装了主题加载逻辑,无需手动调用tk.call加载主题包,直接使用self.set_theme()即可。
修改后的代码:
class Window(ThemedTk): def __init__(self): super().__init__() # 直接用ThemedTk的方法设置主题 self.set_theme("awdark") # 主框架 mainframe = ttk.Frame(self) mainframe.pack(side="top", fill="both", expand=True) # 确保网格布局能随窗口拉伸 mainframe.grid_rowconfigure(0, weight=1) mainframe.grid_columnconfigure(0, weight=1) self.frames = {} for F in (HomePage,): frame = F(mainframe, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame(HomePage) def show_frame(self, fr): self.frames[fr].tkraise() # 改为继承ttk.Frame以应用主题样式 class HomePage(ttk.Frame): def __init__(self, parent, controller): super().__init__(parent) # 页面标题 header_label = ttk.Label( self, text="Post Visual Inspection Board Capture Program", justify="center" ) header_label.pack(pady=20) # 新建捕获按钮 new_capture_button = ttk.Button( self, text="New Capture", # 注意:需提前定义InstructionsPage否则会报错 command=lambda: controller.show_frame(InstructionsPage) ) new_capture_button.place(relx=0.5, rely=0.5, anchor="center")
补充说明:
- 添加
grid_rowconfigure和grid_columnconfigure,确保主框架的子元素能随窗口大小拉伸,避免内容固定无法适配窗口。 - 若仍有区域未被覆盖,检查所有容器组件是否都使用
ttk系列,避免混合tk和ttk组件导致样式不一致。
内容的提问来源于stack exchange,提问作者youChoose10
相关产品推荐
相关产品推荐

