ttk样式"TNotebook.Tab"背景和边框宽度无效

9 投票
1 回答
10718 浏览
提问于 2025-04-17 22:12

我一直在玩TKinter,想创建一个有多个标签的窗口。

当我尝试给TNotebook.Tab设置样式时,它对background(背景色)和borderwidth(边框宽度)的设置没有反应,但对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)

这是这个窗口的样子:

在这里输入图片描述

顺便说一下,我是在64位的Windows 7上运行python 2.7。

1 个回答

8

ttk主题支持的目的是让系统提供的主题引擎来绘制Tk小部件的各种元素,这样我们就能让界面看起来和当前的操作系统风格一致。在Windows Vista及以上版本中,Notebook标签的绘制是由“vsapi”引擎完成的。标签本身就是一个元素,它的外观由Windows主题决定。因此,它不提供修改背景的方式,因为这需要选择一个不同的Windows主题。

不过,你可以选择一个支持更改背景样式的ttk主题中的元素。虽然这样可能在其他方面不太匹配,但你已经偏离了系统提供的主题。要完全控制元素的外观,你可以使用“image”引擎创建一个新元素,并提供用于绘制该元素的图片。更简单的方法是从其他主题中借用一个元素。“default”主题支持指定标签元素的颜色,所以我们可以通过重新创建该元素并重新定义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文档中有提到,但如果你对ttk小部件的设计没有了解,可能不太清楚该怎么做。设计的初衷是希望你不要进行如此极端的自定义,而是让你的应用程序符合用户选择的平台外观和感觉。不过,相关工具是存在的,只是比较深藏不露。这里还有一个链接,展示了一个Tcl示例,添加了关闭按钮到标签

撰写回答