ttk 样式“TNotebook.Tab”背景和边框宽度不起作用

Posted

技术标签:

【中文标题】ttk 样式“TNotebook.Tab”背景和边框宽度不起作用【英文标题】:ttk styling "TNotebook.Tab" background and borderwidth not working 【发布时间】:2014-04-18 19:28:38 【问题描述】:

我一直在玩 TKinter,试图创建一个多标签窗口。

当我尝试设置TNotebook.Tab 的样式时,它会忽略backgroundborderwidth 选项,但它会承认foreground。我做错了什么?

以下是代码的相关部分:

COLOR_1 = 'black'
COLOR_2 = 'white'
COLOR_3 = 'red'
COLOR_4 = '#2E2E2E'
COLOR_5 = '#8A4B08'
COLOR_6 = '#DF7401'

#Notebook Style
noteStyler = ttk.Style()
noteStyler.configure("TNotebook", background=COLOR_1, borderwidth=0)
noteStyler.configure("TNotebook.Tab", background=COLOR_1, foreground=COLOR_3, lightcolor=COLOR_6, borderwidth=0)
noteStyler.configure("TFrame", background=COLOR_1, foreground=COLOR_2, borderwidth=0)

#Create Notebook and Tabs
note = ttk.Notebook(gui, style='TNotebook')
myTab = ttk.Frame(note, style='TFrame')
note.add(myTab, text = 'MyTab', compound=tk.TOP)        
note.pack(anchor=tk.W)

这是窗口外观的图像:

以防万一,我在 Windows 7 64 位上运行 python 2.7。

【问题讨论】:

【参考方案1】:

ttk 主题支持的重点是让系统提供的主题引擎绘制构成 Tk 小部件的各种元素,以便我们匹配当前 UI 的外观。对于 Windows Vista 或更高版本上的笔记本选项卡,这意味着正在使用“vsapi”引擎来绘制元素。该选项卡是一个元素,它的外观由 Windows 主题提供。出于这个原因,它没有提供任何修改背景的方法,因为这是通过选择一个替代的 Windows 主题来完成的。

但是,您可以从确实支持更改背景样式的不同 ttk 主题中选择一个元素。这可能在其他方面不太匹配,但您已经偏离了系统提供的主题。完全控制元素外观的方法是使用“图像”引擎创建一个新元素,并提供用于绘制元素的图像。一种更简单的方法是从其他主题中借用一个元素。 “默认”主题支持指定选项卡元素的颜色,因此我们可以通过重新创建元素并重新定义 TNotebook 布局以使用新元素来借用它。

# Import the Notebook.tab element from the default theme
noteStyler.element_create('Plain.Notebook.tab', "from", 'default')
# Redefine the TNotebook Tab layout to use the new element
noteStyler.layout("TNotebook.Tab",
    [('Plain.Notebook.tab', 'children':
        [('Notebook.padding', 'side': 'top', 'children':
            [('Notebook.focus', 'side': 'top', 'children':
                [('Notebook.label', 'side': 'top', 'sticky': '')],
            'sticky': 'nswe')],
        'sticky': 'nswe')],
    'sticky': 'nswe')])
noteStyler.configure("TNotebook", background=COLOR_1, borderwidth=0)
noteStyler.configure("TNotebook.Tab", background="green", foreground=COLOR_3,
                                      lightcolor=COLOR_6, borderwidth=2)
noteStyler.configure("TFrame", background=COLOR_1, foreground=COLOR_2, borderwidth=0)

提供的选项在一定程度上取决于所使用的主题引擎,并且 Windows 主题比大多数主题更具限制性,因为元素的绘制已移交给第三方。极端自定义是可能的,但确实需要重新定义小部件布局。 python ttk docs 中提到了这一点,但除非您了解 ttk 小部件的设计方式,否则该做什么并不那么明显。设计意图是您不进行如此极端的定制,而是使您的应用程序符合用户选择的平台外观和感觉。但是工具是可用的——只是埋得很深。这是另一个 Tcl 示例的链接,添加了close buttons to the tabs

【讨论】:

以上是关于ttk 样式“TNotebook.Tab”背景和边框宽度不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ttk.ComboBox 样式设置不正确

使用透明背景、ttk 框架背景颜色配置 tkinter/ttk 小部件?

在 tkinter 中更改滚动条的外观(使用 ttk 样式)

是否有 Tkinter/ttk 样式参考?

如何在 Treeview 中编辑标题的样式(Python ttk)

设置 tkinter ttk 框架的背景颜色