TKinter Progressbar样式配置在Windows平台失效问题咨询
TKinter Progressbar样式在Windows不生效的原因及解决办法
原因分析
Windows平台下的ttk控件默认使用系统原生主题(如vista、winnative),这类主题依赖系统自带的控件渲染逻辑,会直接忽略background、foreground这类自定义样式属性。而Linux上的ttk默认主题(如clam)由ttk自身绘制,支持直接通过configure方法修改样式属性,所以你的代码在Linux上能正常生效。
解决办法
方法1:切换到支持自定义样式的ttk主题
将ttk主题切换为clam或alt这类非系统原生主题,即可让自定义样式生效:
import tkinter as tk from tkinter import ttk root = tk.Tk() # 切换到clam主题 style = ttk.Style() style.theme_use('clam') app = tk.Frame(root) app.pack() style.configure("myStyle.Horizontal.TProgressbar", background='yellow', foreground='blue') app.progress = ttk.Progressbar(root, length=200, mode='determinate', style="myStyle.Horizontal.TProgressbar") app.progress.pack() app.progress['value'] = 75 app.mainloop()
方法2:修改系统主题的控件元素(保留Windows风格)
如果想保留Windows原生控件的外观,需要重新定义进度条的bar元素样式,以vista主题为例:
import tkinter as tk from tkinter import ttk root = tk.Tk() style = ttk.Style() # 针对vista主题修改进度条的bar元素 style.element_create("Custom.Horizontal.TProgressbar.trough", "from", "vista") style.element_create("Custom.Horizontal.TProgressbar.bar", "from", "vista", ("active", {"bar": {"side": "left", "sticky": "ns"}})) style.layout("myStyle.Horizontal.TProgressbar", [("Custom.Horizontal.TProgressbar.trough", {"children": [("Custom.Horizontal.TProgressbar.bar", {"side": "left", "sticky": "ns"})], "sticky": "nsew"})]) style.configure("myStyle.Horizontal.TProgressbar", troughcolor='white', background='yellow') app = tk.Frame(root) app.pack() app.progress = ttk.Progressbar(root, length=200, mode='determinate', style="myStyle.Horizontal.TProgressbar") app.progress.pack() app.progress['value'] = 75 app.mainloop()
这样既能保留Windows系统控件的整体风格,又能自定义进度条的颜色。
内容的提问来源于stack exchange,提问作者STF
相关产品推荐
相关产品推荐

