Tkinter-当我使用其他种类的类时,如何正确使用“ ttk.style”语句?

问题描述

在我的真实代码中,我有一个主窗口,用户可以在其中选择打开其他类型的窗口。在主要的代码中,我使用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指令,因为在我的真实代码中,所有类都使用相同的样式。最好的方法是什么?

以下是有关我的示例的屏幕截图:

enter image description here

解决方法

每个Tk实例都是一个单独的环境,并且不能与Tk的其他实例共享数据。如果希望多个窗口能够与第一个窗口共享信息,则必须创建Toplevel而不是Tk的实例。

第二个窗口不接受新样式的原因是您创建的Style对象属于原始根窗口。如果希望它影响新的根窗口,则必须通过指定master属性来明确地告诉它。

style=ttk.Style(master=self.parent)