ttkbootstrap样式失效求助:调用子窗口仍显示tkinter原生样式
解决ttkbootstrap子窗口样式失效问题
主窗口使用ttkbootstrap样式正常,但调用外部模块创建的子窗口显示tkinter原生样式。相关代码如下:
原代码
a.py
from tkinter import filedialog import ttkbootstrap as ttk from ttkbootstrap.constants import * from b import * root = ttk.Window() b1 = ttk.Button(root, text="Button 1", bootstyle=SUCCESS, command=test) b1.pack(side=LEFT, padx=5, pady=10) b2 = ttk.Button(root, text="Button 2", bootstyle=(INFO, OUTLINE)) b2.pack(side=LEFT, padx=5, pady=10) root.mainloop()
b.py
import ttkbootstrap as ttk from ttkbootstrap.constants import * def test(): root = ttk.Window() b1 = ttk.Button(root, text="Button 1", bootstyle=SUCCESS) b1.pack(side=LEFT, padx=5, pady=10) root.mainloop()
问题原因
在test()函数中创建了新的ttk.Window实例并再次调用mainloop(),这会生成一个独立的ttkbootstrap应用上下文,无法继承主窗口的样式配置,同时重复的主循环也会导致程序运行异常。ttk.Window是应用级别的顶层窗口,每个程序应该只保留一个实例和一个主循环,子窗口需使用ttk.Toplevel。
解决方案
修改b.py,将子窗口改为ttk.Toplevel并接收主窗口作为父组件,同时移除多余的mainloop()调用:
修改后的b.py
import ttkbootstrap as ttk from ttkbootstrap.constants import * def test(parent): top = ttk.Toplevel(parent) top.title("子窗口") b1 = ttk.Button(top, text="Button 1", bootstyle=SUCCESS) b1.pack(side=LEFT, padx=5, pady=10)
同时修改a.py中按钮的command参数,传递主窗口作为父组件:
修改后的a.py(关键部分)
b1 = ttk.Button(root, text="Button 1", bootstyle=SUCCESS, command=lambda: test(root))
这样子窗口会自动继承主窗口的ttkbootstrap样式,不会显示原生tkinter样式。
内容的提问来源于stack exchange,提问作者Gordon Zhang
相关产品推荐
相关产品推荐

