Не могу снова показать корневое окно Tkinter после использованияdraw () - PullRequest
0 голосов
/ 19 апреля 2019

В моей программе я создаю окно из своего корневого окна tkinter и скрываю рут с помощью функции .withdraw (). Когда я пытаюсь снова показать корневое окно, вызвав корневой класс, оно не отображается, и моя программа завершает работу. Вот примерный план моего кода с описанием проблемы:

 class MainGUI:
    def __init__(self, master):
        self.master = master
        #....Create and .grid() all GUI Widgets....

        # Button for switching to other window
        button = Button(text="CLICKME", command=lambda: self.other_window())

        # Call and define show function at the end of __init__
        self.show()
        def show(self):
            self.master.update()
            self.master.deiconify()

        # Create other window and withdraw self on button click
        def other_window(self):
            OtherGUI(self.master)
            self.master.withdraw()


class OtherGUI:
    def __init__(self, master):
        # Function for returning to main window, calls MainGUI class
        # to create window and withdraws self.
        def main_window():
            MainGUI(self.master)
            self.master.withdraw()

        master = self.master = Toplevel(master)
        #....Create and .grid() all GUI Widgets....

        # Button for switching back to main window
        button = Button(text="CLICKME", command=lambda: self.main_window())

Используя функции печати в MainGUI, я смог увидеть, что при попытке вернуться обратно в главное окно фактически вызывается show (), и кажется, что вводится весь класс.

Это озадачивает меня, поскольку я только действительно научился делать это из других сообщений на форуме, и использование root.update () и .deiconify () казалось решением для большинства людей, однако я понятия не имею, почему это не работает

Кто-нибудь имеет представление о том, где я иду не так?

1 Ответ

2 голосов
/ 19 апреля 2019

Приведенный вами пример не будет работать по нескольким причинам.

#really you should build your gui as an inherited class as it makes things much easier to manage in tkinter.
class MainGUI:
    def __init__(self, master):
        self.master = master


        button = Button(text="CLICKME", command=lambda: self.other_window())
        # no need for lambda expressions here.
        # missing geometry layout... grid(), pack() or place()

        self.show()
        # self.show does nothing here because your show method is improperly indented.
        # your other_window method is also not properly indented.

        def show(self):
            self.master.update()
            self.master.deiconify()

        def other_window(self):
            OtherGUI(self.master)
            self.master.withdraw()


class OtherGUI:
    def __init__(self, master):
        # this function should be its own method.
        def main_window():
            MainGUI(self.master)
            self.master.withdraw()

        master = self.master = Toplevel(master)
        # this is not how you should be defining master.

        button = Button(text="CLICKME", command=lambda: self.main_window())
        # missing geometry layout... grid(), pack() or place()
        # your button command is using a lambda to call a class method but your define it as a function instead.

Вот более простая версия того, что вы пытаетесь сработать:

import tkinter as tk


class MainGUI(tk.Tk):
    def __init__(self):
        super().__init__()
        tk.Button(self, text="Open Toplevel", command=self.open_toplevel_window).pack()

    def open_toplevel_window(self):
        OtherGUI(self)
        self.withdraw()


class OtherGUI(tk.Toplevel):
    def __init__(self, master):
        super().__init__()
        tk.Button(self, text="Close top and deiconify main", command=self.main_window).pack()

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


MainGUI().mainloop()

Как вы можете видетьздесь, когда вы наследуете от классов tkinter, которые управляют главным окном и окнами верхнего уровня, становится проще управлять ими и меньше кода для выполнения задачи.

...