是否可以在 python 的 tkinter 中为每个 class 保持相同的 window?

Is it possible to keep the same window for every class in python's tkinter?

我正在尝试在 tkinter 中创建一个程序,它允许我打开一个初始 window 然后在所有使用的 class 中保留它。例如,如果我要在 window 中创建一个按钮,那么当我单击此按钮时,它将执行一个销毁小部件的方法,然后执行一个新的 class 以在其中构建一个新屏幕相同的 window,例如与按钮相对的文本。

from tkinter import *

class Window1:

    def __init__(self, master):
        self.master = master
        self.label = Button(self.master, text = "Example", command = self.load_new)
        self.label.pack()

    def load_new(self):
        self.label.destroy()
        ## Code to execute next class

class Window2:

    def __init__(self, master):
        self.master = master
        self.label = Label(self.master, text = "Example")
        self.label.pack()

def main():
    root = Tk()
    run = Window1(root)
    root.mainloop()

if __name__ == '__main__':
main()

我知道这不太实用,但我很好奇。干杯。

Tk() 创建主 window 和变量 root 使您可以访问此 window。您可以使用 root 作为 Window2 的参数,您将可以访问 Window2

中的 main window
from tkinter import *


class Window1:

    def __init__(self, master):

        # keep `root` in `self.master`
        self.master = master 

        self.label = Button(self.master, text="Example", command=self.load_new)
        self.label.pack()

    def load_new(self):
        self.label.destroy()

        # use `root` with another class
        self.another = Window2(self.master)


class Window2:

    def __init__(self, master):

        # keep `root` in `self.master`
        self.master = master

        self.label = Label(self.master, text="Example")
        self.label.pack()


root = Tk()
run = Window1(root)
root.mainloop()

--

可能没有人使用另一个 class 来创建 Label 来代替 Button ;)

--

编辑: 在此示例中,使用名称 Window1Windows2 具有误导性,因为只有一个 window 和两个 classes 使用这个 window。我宁愿使用名称 FirstOwnerSecondOwner

一切都在一个 Tk class 中实现,在这种情况下总是只有一个 window。

from tkinter import *
from tkinter import ttk


class MainWindow():

    def __init__(self, mainWidget):
        self.main_frame = ttk.Frame(mainWidget, width=300, height=150, padding=(0, 0, 0, 0))
        self.main_frame.grid(row=0, column=0)

        self.some_kind_of_controler = 0

        self.main_gui()

    def main_gui(self):
        root.title('My Window')

        self.main_label_1 = ttk.Label(self.main_frame, text='Object_1')
        self.main_label_1.grid(row=0, column=0)

        self.main_label_2 = ttk.Label(self.main_frame, text='Object_2')
        self.main_label_2.grid(row=1, column=0)

        self.main_label_3 = ttk.Label(self.main_frame, text='Object_3')
        self.main_label_3.grid(row=2, column=0)

        self.setings_button = ttk.Button(self.main_frame, text='Setings')
        self.setings_button.grid(row=0, column=1)
        self.setings_button.bind('<Button-1>', self.setings_gui)

        self.gui_elements = [self.main_label_1,
                             self.main_label_2,
                             self.main_label_3,
                             self.setings_button]

    def setings_gui(self, event):
        self.gui_elements_remove(self.gui_elements)

        root.title('Setings')

        self.main_label_1 = ttk.Label(self.main_frame, text='Object_1')
        self.main_label_1.grid(row=2, column=0)

        self.main_menu_button = ttk.Button(self.main_frame, text='Main menu')
        self.main_menu_button.grid(row=0, column=1)
        self.main_menu_button.bind('<Button-1>', self.back_to_main)

        self.some_kind_of_controler = 1

        self.gui_elements = [self.main_label_1,
                             self.main_menu_button]

    def back_to_main(self, event):
        if self.some_kind_of_controler == 1:
            self.gui_elements_remove(self.gui_elements)
        else:
            pass
        self.main_gui()

    def gui_elements_remove(self, elements):
        for element in elements:
            element.destroy()

def main():
    global root

    root = Tk()
    root.geometry('300x150+50+50')
    window = MainWindow(root)

    root.mainloop()

if __name__ == '__main__':
    main()