如何在 Class、Tkinter、ttkThemes、ThemedTk Python 中使用时更改整个应用的主题

How to change whole app's theme when used within Class, Tkinter, ttkThemes, ThemedTk Python

总结: 我在互联网上搜索了有关 tkinter 的其他主题。我找到了 ttkthemes - ThemedTk 选项。但是,我的应用程序是在 class 内创建的。模块网站中显示的示例之间的区别,themedtk 示例使用 root 方法应用。这是代码:

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()

当我 运行 应用程序并单击样式并选择样式时。我收到此错误:

AttributeError: '_tkinter.tkapp' 对象没有属性 '_toplevel'

我花了很多时间来解决它。提前致谢。

您在行

中忘记了()
self.style = ThemedTk()

之后你必须删除

中的 self
self.style.set_theme(theme_name=still)

现在它运行没有错误,但它仍然没有改变主题。

可能需要使用 ttk.

的小部件

编辑:

您必须使用 ThemedTk 代替 tk.Tk。并直接使用self.set_theme()

当然,您还需要 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()

或者您可以使用 TkThemedStyle(而不是 ThemedTk
然后你可以设置 self.style = ThemedStyle()
但你必须使用 self.style.theme_use(name) 而不是 self.set_theme(name)

它需要 self.style.get_themes() 而不是 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()

我找到了所有主题的屏幕截图:List of ttk Themes


旧答案

我只有 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()

默认:

蓝色:

克罗克:

辐射或Ubuntu:

Winxpblue:


来源继续GitHub:furas / python-examples / tkinter / themes-change-ttkthemes / buttons