问题描述
在我的真实代码中,我有一个主窗口,用户可以在其中选择打开其他类型的窗口。在主要的代码中,我使用ttk
语句定义了ttk.style()
样式。它可以工作,但是如果我在其他窗口专用的其他类中定义了相同的样式,则ttk.style()
将不再起作用。为什么?下面是一个示例:
from tkinter import *
from tkinter import ttk
class MainWindow:
def __init__(self):
self.parent=Tk()
self.parent.geometry("400x400")
self.parent.title(self.main_name)
self.parent.configure(background="#f0f0f0")
style=ttk.Style()
style.configure("TButton",background="red",padding=0)
MyButton=ttk.Button(self.parent,text="open a new window",command=self.Open)
MyButton.pack()
self.parent.mainloop()
def Open(self):
obj=NewWindow()
class NewWindow():
def __init__(self):
self.parent=Tk()
self.parent.geometry("400x400")
self.parent.configure(background="#f0f0f0")
style=ttk.Style()
style.configure("TButton",padding=0)
MyButton=ttk.Button(self.parent,text="This button has not a custom style.. why?")
MyButton.pack()
if __name__=="__main__":
app=MainWindow()
为什么NewWindow
类的窗口不像ttk
类中的另一种那样使用自定义MainWindow
样式?
然后,我只想编写一次ttk
指令,因为在我的真实代码中,所有类都使用相同的样式。最好的方法是什么?
解决方法
每个Tk
实例都是一个单独的环境,并且不能与Tk
的其他实例共享数据。如果希望多个窗口能够与第一个窗口共享信息,则必须创建Toplevel
而不是Tk
的实例。
第二个窗口不接受新样式的原因是您创建的Style
对象属于原始根窗口。如果希望它影响新的根窗口,则必须通过指定master
属性来明确地告诉它。
style=ttk.Style(master=self.parent)