You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:41:16