Setting background color of a tkinter ttk frame
Asked Answered
E

3

12

I want to simply set a background color to the frame within the tkinter window. The background color for the window was successfully set, but not for the frame inside. Simply entering bg='color_name or color_code' is not working.

How can one set the background color of a ttk frame?

In addition to this, is there a method to also change other widget options i.e. the color, fonts of the tabs bar?

I have tried using command bg='Color_name or color_code' and also tried using frame_name=config(bg='color_name or color_code'). Neither worked.

from tkinter import * 
from tkinter import ttk 


window = Tk() 
window.title("Title Name") 
window.config(bg='#FFFAFA')
window.geometry('1024x800')


menubar = Menu(window) 
filemenu = Menu(menubar,tearoff=0)
menubar.add_cascade(label='File',menu=filemenu)
filemenu.add_command(label='Open')
filemenu.add_command(label='Clear')
filemenu.add_command(label='Save As')
filemenu.add_separator()
filemenu.add_command(label='Exit')


helpmenu = Menu(menubar,tearoff=0)
menubar.add_cascade(label='Help',menu=helpmenu)
helpmenu.add_command(label='Precuations')
helpmenu.add_command(label='Version Info')
helpmenu.add_command(label='Technical Support')

window.config(menu=menubar)

rows = 0
while rows<50:
    window.rowconfigure(rows,weight=1)
    window.columnconfigure(rows, weight=1)
    rows +=1

#creation of frame
mainframe = ttk.Notebook(window,width=50)
mainframe.grid(row=1,column=2,columnspan=45,rowspan=43,sticky='NESW')

#create tabs within the frame
tab1 = ttk.Frame(mainframe)
mainframe.add(tab1, text="Tab1")


tab2 = ttk.Frame(mainframe)
mainframe.add(tab2, text="Tab2")


tab3 = ttk.Frame(mainframe)
mainframe.add(tab3, text="Tab3")

tab4 = ttk.Frame(mainframe)
mainframe.add(tab4, text="Tab4")

tab5 = ttk.Frame(mainframe)
mainframe.add(tab5, text="Tab4")

window.mainloop()
Eaddy answered 1/2, 2019 at 9:27 Comment(1)
This was of help: List of Default Styles web.archive.org/web/20230823214211/https://coderslegacy.com/… youtu.be/XGWCdEEYp0oFinsteraarhorn
T
19

When using ttk widgets, all styling should be done using ttk.Style.

You need to initialize the style class with s = ttk.Style(), and can then change attributes of the different widget styles with s.configure('StyleName', option='value')

You can find the default style names here. So for a Frame the style name is TFrame. When you configure an option for this style, it will be used by all frames. When you want to configure an option for a single frame, you can create a new style based on the original style by using a name of the form newName.oldName. In your case, this could be Frame1.TFrame. You can then tell a frame to use this style by passing style='Frame1.TFrame'.

If you use the following in your code, you will see that the first frame is red, the second is blue and all other frames are green:

# Initialize style
s = ttk.Style()
# Create style used by default for all Frames
s.configure('TFrame', background='green')

# Create style for the first frame
s.configure('Frame1.TFrame', background='red')
# Use created style in this frame
tab1 = ttk.Frame(mainframe, style='Frame1.TFrame')
mainframe.add(tab1, text="Tab1")

# Create separate style for the second frame
s.configure('Frame2.TFrame', background='blue')
# Use created style in this frame
tab2 = ttk.Frame(mainframe, style='Frame2.TFrame')
mainframe.add(tab2, text="Tab2")
Territus answered 1/2, 2019 at 9:46 Comment(1)
Thank you so much for your support! The issue has been resolved. This technique worked and the frames are now displaying the background color as set. Also, the link shared is of get help and I will try customizing others widgets as well in the GUI.Eaddy
J
4

You are using ttk widgets which have their styling options wraped up in styles. Thus, for ttk widgets you cannot change such style options as bgcolor directly. You have to edit or create new styles. More info about this here: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-style-layer.html

Change your code like this to display a new color:

# create frame style
s = ttk.Style()
s.configure('new.TFrame', background='#7AC5CD')

#create tabs within the frame
tab1 = ttk.Frame(mainframe, style='new.TFrame')
mainframe.add(tab1, text="Tab1")


tab2 = ttk.Frame(mainframe, style='new.TFrame')
mainframe.add(tab2, text="Tab2")


tab3 = ttk.Frame(mainframe, style='new.TFrame')
mainframe.add(tab3, text="Tab3")

tab4 = ttk.Frame(mainframe, style='new.TFrame')
mainframe.add(tab4, text="Tab4")

tab5 = ttk.Frame(mainframe, style='new.TFrame')
mainframe.add(tab5, text="Tab4")
Jovial answered 1/2, 2019 at 9:34 Comment(1)
Thank you so much for your reply. The technique worked and the issue has been resolved. The frames are now showing the background color as set.Eaddy
D
0

Please follow below step

  1. Create object of style class
s = ttk.Style()
  1. Using that object define style

  2. First argument : style name, this name is placed in all frames where you want to give this style

s.configure('frameName', background='#fff')
  1. Create frame and assign this style
frm1 = ttk.Frame(root, style='frameName')
Daryldaryle answered 3/2, 2020 at 6:49 Comment(1)
Please, add some tags to your question, so that it's more searchable for the experts of this topic. Also, try to explain your problem with more details, and snippets if needed.Durman

© 2022 - 2024 — McMap. All rights reserved.