样式中指定的填充被 Ttk Frame 忽略
Padding specified in style ignored by Ttk Frame
以下代码按预期工作,在绿色背景框(也有很多填充)中显示一个红色背景按钮(有很多填充)。请注意,在 Style 语句和 ttk.Frame 初始化中都指定了帧填充。
import ttk
import Tkinter
root = Tkinter.Tk()
ttk.Style().configure("TFrame", background="#0c0", padding=60)
ttk.Style().configure("TButton", background="#c00", padding=20)
frame = ttk.Frame(root, padding=60)
frame.pack()
btn = ttk.Button(frame, text="Button")
btn.pack()
root.mainloop()
但是,现在,从框架初始化中删除 'padding=60' 行(即 frame = ttk.Frame(root)
),仅将其保留在 Style().configure(...)
语句中,而 window弹出的框架中没有填充(因此您也无法分辨背景颜色是什么)。相反,只有红色背景按钮占据了整个 window。尽管有 Style 语句,框架填充已恢复为默认值 0。
为什么为样式 "TFrame" 指定的填充被忽略?另一个属性 ("background") 已正确应用于框架,填充和背景属性均已使用 TButton 样式正确应用于按钮。
TFrame 的布局不包含填充元素,因此没有样式元素可以在您的样式中使用配置的填充值。您可以通过检查布局看到这一点:
>>> from tkinter import *
>>> from tkinter.ttk import *
>>> style = Style()
>>> style.theme_use('default') # select the Unix theme
>>> style.layout("TFrame")
[('Frame.border', {'sticky': 'nswe'})]
看看像 TButton 这样使用填充的东西:
>>> style.layout("TButton")
[('Button.border', {'border': '1', 'children':
[('Button.focus', {'children':
[('Button.padding', {'children':
[('Button.label', {'sticky': 'nswe'})],
'sticky': 'nswe'})],
'sticky': 'nswe'})],
'sticky': 'nswe'})]
在此布局中,我们有一个 "border" 元素,它将使用 borderwidth
和 relief
配置选项。一个 focus
元素来处理聚焦环的显示。还有一个 padding
元素,用于包含配置的填充量。
TFrame 样式不使用任何填充元素。但是,Frame 小部件确实使用了小部件填充值。当放置包含的小部件时,小部件本身使用它来定义内部填充。这不包括在样式中,而是作为小部件特定选项。
以下代码按预期工作,在绿色背景框(也有很多填充)中显示一个红色背景按钮(有很多填充)。请注意,在 Style 语句和 ttk.Frame 初始化中都指定了帧填充。
import ttk
import Tkinter
root = Tkinter.Tk()
ttk.Style().configure("TFrame", background="#0c0", padding=60)
ttk.Style().configure("TButton", background="#c00", padding=20)
frame = ttk.Frame(root, padding=60)
frame.pack()
btn = ttk.Button(frame, text="Button")
btn.pack()
root.mainloop()
但是,现在,从框架初始化中删除 'padding=60' 行(即 frame = ttk.Frame(root)
),仅将其保留在 Style().configure(...)
语句中,而 window弹出的框架中没有填充(因此您也无法分辨背景颜色是什么)。相反,只有红色背景按钮占据了整个 window。尽管有 Style 语句,框架填充已恢复为默认值 0。
为什么为样式 "TFrame" 指定的填充被忽略?另一个属性 ("background") 已正确应用于框架,填充和背景属性均已使用 TButton 样式正确应用于按钮。
TFrame 的布局不包含填充元素,因此没有样式元素可以在您的样式中使用配置的填充值。您可以通过检查布局看到这一点:
>>> from tkinter import *
>>> from tkinter.ttk import *
>>> style = Style()
>>> style.theme_use('default') # select the Unix theme
>>> style.layout("TFrame")
[('Frame.border', {'sticky': 'nswe'})]
看看像 TButton 这样使用填充的东西:
>>> style.layout("TButton")
[('Button.border', {'border': '1', 'children':
[('Button.focus', {'children':
[('Button.padding', {'children':
[('Button.label', {'sticky': 'nswe'})],
'sticky': 'nswe'})],
'sticky': 'nswe'})],
'sticky': 'nswe'})]
在此布局中,我们有一个 "border" 元素,它将使用 borderwidth
和 relief
配置选项。一个 focus
元素来处理聚焦环的显示。还有一个 padding
元素,用于包含配置的填充量。
TFrame 样式不使用任何填充元素。但是,Frame 小部件确实使用了小部件填充值。当放置包含的小部件时,小部件本身使用它来定义内部填充。这不包括在样式中,而是作为小部件特定选项。