为何ttk.Style().configure无法为Frame应用自定义样式?(Python3,tkinter,ttk)
问题:ttk Frame自定义样式不生效
我在用Python 3.10.2编写tkinter/ttk的简单Frame布局时碰到个问题:用style的configure方法创建了'new.TFrame'样式并设置了绿色背景,但把这个样式指定给Frame后完全没效果,代码没报错,可就是不显示背景色。不过同样方式设置的'new.TButton'样式是正常生效的。
我的代码如下:
import tkinter as tk from tkinter import ttk root = tk.Tk() root.title('style Test') root.geometry('400x300') style = ttk.Style() style.configure('new.TFrame', background='green') style.configure('new.TButton', font=('Myriad Pro', 20), background='red') mainFrame = ttk.Frame(root, width=200, height=200, style='new.TFrame') mainFrame.grid() button = ttk.Button(root, text='Some text' ,style='new.TButton') button.grid() root.mainloop()
解决办法
这跟Python版本没关系,是ttk Frame的样式特性导致的:
- 多数平台的默认ttk主题里,Frame本身是透明的,设置
background不会直接生效,它会继承父组件的背景。 - 有几个可行的解决方式:
- 给Frame加relief属性:哪怕设为
flat,也能强制ttk渲染背景样式。修改Frame的创建代码:mainFrame = ttk.Frame(root, width=200, height=200, style='new.TFrame', relief='flat') - 改用fieldbackground配置样式:部分主题里Frame的背景由
fieldbackground控制,调整样式代码:style.configure('new.TFrame', fieldbackground='green') - 切换ttk主题:如果上面两种方法都不行,试试切换到支持Frame背景色的主题,比如
clam:style.theme_use('clam')
- 给Frame加relief属性:哪怕设为
内容的提问来源于stack exchange,提问作者RichardL
相关产品推荐
相关产品推荐

