我正在 Tkinter 中制作 GUI,并希望太阳谷主题 (https://github.com/rdbende/Sun-Valley-ttk-theme) 影响我的所有窗口。
当我运行代码时,仅第一个窗口(在这种情况下)测试类具有主题,当我单击按钮并运行下一个窗口 Main 时,主题未应用。
我已经尝试过使用和不使用 Test.destroy(),而不是在 Main() 中使用 sv_ttk.use_dark_theme(),并且我还尝试来回切换主题,没有任何变化。
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()
就在我看到问题之后,您正在为 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()