首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Class、Tkinter、ttkThemes、ThemedTk Python中使用整个应用程序的主题

如何在Class、Tkinter、ttkThemes、ThemedTk Python中使用整个应用程序的主题
EN

Stack Overflow用户
提问于 2022-04-03 13:41:37
回答 1查看 309关注 0票数 0

摘要:我在网上搜索了tkinter的其他主题。我找到了ThemedTk主题-ThemedTk选项。但是,我的应用程序是在类内创建的。模块网站中显示的示例之间的区别,主题示例是用根方法应用的。以下是代码:

代码语言:javascript
复制
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”

我花了很长时间才解决这个问题。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 01:16:32

你把()忘在排队了

代码语言:javascript
复制
self.style = ThemedTk()

之后,必须将self移除

代码语言:javascript
复制
self.style.set_theme(theme_name=still)

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

也许它需要使用来自ttk的小部件。

编辑:

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

当然,您还需要一些来自ttk的小部件。

代码语言:javascript
复制
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()

代码语言:javascript
复制
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()

我找到了所有主题的截图:ttk主题清单

旧答案

我只有使用ttk.Buttons的示例

代码语言:javascript
复制
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()

默认值:

蓝色:

Kroc:

亮度或Ubuntu:

Winxpblue:

源保持在GitHub:furas /python-示例/ tkinter /主题-更改-themes主题/按钮

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71726458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档