在Ttk Frame忽略的样式中指定的填充

时间:2015-02-10 23:24:16

标签: python tkinter tk 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()

然而,现在,从Frame初始化(即frame = ttk.Frame(root))中删除'padding = 60'行,只将其保留在Style().configure(...)语句中,弹出的窗口没有填充在框架中(因此您无法分辨背景颜色)。相反,只有红色背景按钮占据了整个窗口。尽管Style语句,帧填充还是恢复为默认值0。

为什么忽略为样式“TFrame”指定的填充?另一个属性(“背景”)正确应用于Frame,并且使用TButton样式将填充和背景属性正确应用于Button。

1 个答案:

答案 0 :(得分:3)

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'})]

在这种布局中,我们有一个"边界"将使用borderwidthrelief配置选项的元素。一个focus元素来处理显示焦点环。还有一个padding元素,用于包含配置的填充量。

TFrame样式不使用任何填充元素。但是,Frame小部件确实使用小部件填充值。当放置包含的小部件时,小部件本身使用它来定义内部填充。这不是样式所涵盖,而是作为特定于小部件的选项。