I been playing around with TKinter trying to create a multiple tab window.
When I try to style the TNotebook.Tab
it ignores the options background
and borderwidth
, but it acknowledges foreground
. What am I doing wrong?
Here is the relevant part of the code:
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)
Here is an image of what the window looks like:
In case it matters, I'm running python 2.7 on Windows 7 64-bit.
The point of the ttk theming support is to get the system provided theming engine to draw the various elements that make up a Tk widget so that we match the current UI's look and feel. In the case of the Notebook Tab on Windows Vista or above that means the 'vsapi' engine is being used to draw the elements. The tab is an element and it's look is provided by the Windows theme. For this reason it doesn't provide any way to modify the background as that is done by selecting an alternative Windows theme.
However, what you can do is select an element from a different ttk theme that does support changing the background style. This may not match closely in other ways but you are already diverging from the system provided theme. The way to completely control the look of your element is to create a new element using the 'image' engine and provide images to be used to paint the element. A simpler method is to borrow an element from one of the other themes. The 'default' theme provides support for specifying the color of the tab element so we could borrow that by recreating the element and redefining the TNotebook layout to use the new element.
# 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)
The options made available depend on the theming engine in use to some extent and the Windows theme is more restrictive than most because the drawing of the elements is handed over to a third party. Extreme customisation is possible but does require redefining the widget layout. This is mentioned in the python ttk docs but unless you know something about how ttk widgets are designed it's not that obvious what to do. The design intent is that you don't make such extreme customization but make your application conform to the users selected platform look and feel. But the tools are available - just buried quite deeply. Here is another link to a Tcl example that adds close buttons to the tabs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With