如何在 Tkinter 的所有窗口上使用主题

问题描述 投票:0回答:1

我正在 Tkinter 中制作 GUI,并希望太阳谷主题 (https://github.com/rdbende/Sun-Valley-ttk-theme) 影响我的所有窗口。

当我运行代码时,仅第一个窗口(在这种情况下)测试类具有主题,当我单击按钮并运行下一个窗口 Main 时,主题未应用。

我已经尝试过使用和不使用 Test.destroy(),而不是在 Main() 中使用 sv_ttk.use_dark_theme(),并且我还尝试来回切换主题,没有任何变化。

这是我的代码之后两个窗口的两个屏幕截图: Test() window Main() window

import tkinter as tk
from tkinter import ttk
import sv_ttk

class Test(tk.Tk):

    def __init__(self):
        super().__init__()

        sv_ttk.use_dark_theme()

        self.geometry('250x150')
        self.title("Test")
        self.resizable(0,0)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=3)

        testButton = ttk.Button(self, text="Press me!", command=lambda : self.newWindow()).grid(column=0, row=3, sticky=tk.E, padx=5, pady=5)   

    def newWindow(self):
        self.newWindow = Main()
        Test.destroy()
                    
class Main(tk.Tk):
    def __init__(self):
        super().__init__()
        sv_ttk.use_dark_theme()

        self.geometry('1200x800')
        self.title("Main")

        self.resizable(0,0)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)


        self.test = ttk.Checkbutton(self, text="testing", style="Toggle.TButton")
        self.test.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)
        

    
if __name__ =="__main__":
    Test=Test()
    Test.mainloop()
python tkinter ttk ttkthemes
1个回答
0
投票

就在我看到问题之后,您正在为 Test 和 Main 类使用 tk.Tk() ,这会为每个窗口创建单独的 Tkinter 实例。您可以做的是,您应该在初始主窗口之后使用 tk.Toplevel() 作为附加窗口。这对我有用,也应该对你有用

import tkinter as tk
from tkinter import ttk
import sv_ttk

class Test(tk.Tk):

def __init__(self):
    super().__init__()

    sv_ttk.use_dark_theme()

    self.geometry('250x150')
    self.title("Test")
    self.resizable(0,0)
    self.columnconfigure(0, weight=1)
    self.columnconfigure(1, weight=3)

    testButton = ttk.Button(self, text="Press me!", command=lambda : 
    self.newWindow())
    testButton.grid(column=0, row=3, sticky=tk.E, padx=5, pady=5)   

def newWindow(self):
    self.newWindow = Main(self)  
    self.withdraw()  
             
class Main(tk.Toplevel):  
 def __init__(self, master=None):  
    super().__init__(master)
    sv_ttk.use_dark_theme()

    self.geometry('1200x800')
    self.title("Main")
    self.resizable(0,0)
    self.columnconfigure(0, weight=1)
    self.columnconfigure(1, weight=1)

    self.test = ttk.Checkbutton(self, text="testing", style="Toggle.TButton")
    self.test.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)
    
    self.protocol("WM_DELETE_WINDOW", self.on_close) 

def on_close(self):
    self.master.deiconify() 
    self.destroy()  

if __name__ =="__main__":
    app = Test()
    app.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.