ttk造型"TNotebook.Tab"背景和边框宽度不起作用

Lex*_*Lex 7 python tk-toolkit tkinter ttk python-2.7

我一直在玩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)
Run Code Online (Sandbox Code Playgroud)

这是窗口的图像:

在此输入图像描述

如果它很重要,我在Windows 7 64位上运行python 2.7.

pat*_*yts 5

ttk主题支持的关键是让系统提供主题引擎来绘制构成Tk小部件的各种元素,以便我们匹配当前UI的外观.对于Windows Vista或更高版本的Notebook选项卡,这意味着'vsapi'引擎用于绘制元素.选项卡是一个元素,它的外观由Windows主题提供.因此,它没有提供任何修改背景的方法,因为这是通过选择其他Windows主题来完成的.

不过,你可以做的是选择从不同的TTK的主题,一个元素支持更改背景风格.这可能与其他方式不太匹配,但您已经偏离了系统提供的主题.完全控制元素外观的方法是使用"图像"引擎创建一个新元素,并提供用于绘制元素的图像.一种更简单的方法是从其他主题中借用一个元素.'default'主题支持指定tab元素的颜色,因此我们可以通过重新创建元素并重新定义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)
Run Code Online (Sandbox Code Playgroud)

可用的选项取决于在某种程度上使用的主题引擎,并且Windows主题比大多数更具限制性,因为元素的绘制被移交给第三方.可以进行极端定制,但确实需要重新定义小部件布局.这在python ttk文档中提到过,但除非你知道如何设计ttk小部件,否则不是很明显该做什么.设计意图是您不要进行如此极端的自定义,而是使您的应用程序符合用户选择的平台外观.但这些工具是可用的 - 只是埋藏得很深.这是另一个指向Tcl示例的链接,该示例向选项卡添加了关闭按钮