Summary: I searched the internet about additional themes for tkinter. I found ttkthemes – ThemedTk option. However, my app is created within class. The difference between the example shown in the module website, the themedtk example is applied with root method. Here is the code:
import os
from tkinter import *
import tkinter as tk
from tkinter import ttk, filedialog
from PIL import ImageTk, Image
from ttkthemes import ThemedTk,THEMES
class App(tk.Tk):
def __init__(self):
super().__init__()
self.style = ThemedTk
self.title(dil_sec[0])
self.geometry("800x600")
self.my_notebook = ttk.Notebook(self)
self.my_notebook.pack(pady=15)
self.my_menu = Menu(self)
self.config(menu=self.my_menu)
rec = None
id_num = None
self.first_lane = Menu(self.my_menu)
self.my_menu.add_cascade(label=dil_sec[6], menu=self.first_lane)
self.first_lane.add_command(label=dil_sec[2], command=self.customer_list)
self.first_lane.add_command(label=dil_sec[1], command=lambda: self.customer_add(rec, id_num))
self.second_lane = Menu(self.my_menu)
self.my_menu.add_cascade(label=dil_sec[3], menu=self.second_lane)
self.third_lane = Menu(self.my_menu)
self.my_menu.add_cascade(label= dil_sec[65], menu=self.third_lane)
self.third_lane.add_command(label=THEMES[0],command=lambda: self.stil_changer(still=THEMES[0]))
self.third_lane.add_command(label=THEMES[1],command=lambda: self.stil_changer(still=THEMES[1]))
def stil_changer(self,still):
print(still)
self.style.set_theme(self,theme_name=still)
if __name__ == "__main__":
app = App()
app.mainloop()
When I run the application and the click the style and choose a style. I receive this error:
AttributeError: ‘_tkinter.tkapp’ object has no attribute ‘_toplevel’
It took so much time of me to solve it. Thanks in advance.
Advertisement
Answer
You forgot ()
in line
self.style = ThemedTk()
and later you have to remove self
in
self.style.set_theme(theme_name=still)
and now it runs without error but still it doesn’t change theme.
Maybe it needs to use widgets from ttk
.
EDIT:
You have to use ThemedTk
in place of tk.Tk
. And use directly self.set_theme()
And of course you need some widgets from ttk
.
import tkinter as tk
import tkinter.ttk as ttk
from ttkthemes import ThemedTk
class App(ThemedTk):
def __init__(self):
super().__init__()
self.geometry("800x600")
self.my_notebook = ttk.Notebook(self)
self.my_notebook.pack(pady=15, fill='both', expand=True)
self.frame = ttk.Frame(self.my_notebook)
self.my_notebook.add(self.frame, text='Buttons')
for number in range(10):
b = ttk.Button(self.frame, text=str(number))
b.pack()
self.my_menu = tk.Menu(self)
self.config(menu=self.my_menu)
self.first_lane = tk.Menu(self.my_menu)
self.first_lane.add_command(label='a')
self.first_lane.add_command(label='b')
self.my_menu.add_cascade(label='Menu1', menu=self.first_lane)
self.second_lane = tk.Menu(self.my_menu)
self.my_menu.add_cascade(label='Menu2', menu=self.second_lane)
self.third_lane = tk.Menu(self.my_menu)
self.my_menu.add_cascade(label='Style', menu=self.third_lane)
for item in sorted(self.get_themes()):
self.third_lane.add_command(label=item, command=lambda name=item: self.changer_theme(name))
def changer_theme(self, name):
print('theme:', name)
self.set_theme(name)
if __name__ == "__main__":
app = App()
app.mainloop()
Or you can use Tk
with ThemedStyle
(instead of ThemedTk
)
and then you can set self.style = ThemedStyle()
but you have to use self.style.theme_use(name)
instead of self.set_theme(name)
And it needs self.style.get_themes()
instead of self.get_themes()
.
import tkinter as tk
import tkinter.ttk as ttk
from ttkthemes import ThemedStyle
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("800x600")
self.style = ThemedStyle() # with Tk and ThemedStyle
self.my_notebook = ttk.Notebook(self)
self.my_notebook.pack(pady=15, fill='both', expand=True)
self.frame = ttk.Frame(self.my_notebook)
self.my_notebook.add(self.frame, text='Buttons')
for number in range(10):
b = ttk.Button(self.frame, text=str(number))
b.pack()
self.my_menu = tk.Menu(self)
self.config(menu=self.my_menu)
self.first_lane = tk.Menu(self.my_menu)
self.first_lane.add_command(label='a')
self.first_lane.add_command(label='b')
self.my_menu.add_cascade(label='Menu1', menu=self.first_lane)
self.second_lane = tk.Menu(self.my_menu)
self.my_menu.add_cascade(label='Menu2', menu=self.second_lane)
self.third_lane = tk.Menu(self.my_menu)
self.my_menu.add_cascade(label='Style', menu=self.third_lane)
#for item in sorted(self.get_themes()): # with ThemedTk
for item in sorted(self.style.get_themes()): # with Tk and ThemedStyle
self.third_lane.add_command(label=item, command=lambda name=item: self.changer_theme(name))
def changer_theme(self, name):
print('theme:', name)
#self.set_theme(name) # with ThemedTk
self.style.theme_use(name) # with Tk and ThemedStyle
if __name__ == "__main__":
app = App()
app.mainloop()
I found screenshots for all themes: List of ttk Themes
OLD ANSWER
I have only working example with ttk.Buttons
import tkinter as tk
from tkinter import ttk
import ttkthemes
root = tk.Tk()
root.style = ttkthemes.ThemedStyle()
for i, name in enumerate(sorted(root.style.theme_names())):
b = ttk.Button(root, text=name, command=lambda name=name:root.style.theme_use(name))
b.pack(fill='x')
root.mainloop()
Default:
Blue:
Kroc:
Radiance or Ubuntu:
Winxpblue:
Source keep on GitHub: furas / python-examples / tkinter / themes-change-ttkthemes / buttons