Tkinter уничтожает Toplevel и создает еще одну ошибку - PullRequest
1 голос
/ 03 февраля 2020

При попытке создать второй Toplevel на Tkinter после закрытия первого я получаю сообщение об ошибке:

_tkinter.TclError: неверное имя пути к окну ".! Toplevel

Ошибка возникает только тогда, когда первый Toplevel закрыт, когда я запускаю код без close_window() ошибки не возникает и new_window работает и создает второй Toplevel. Мне нужно иметь возможность закрыть первый Toplevel, и я не уверен, что здесь идет не так, поэтому любая помощь очень ценится.

Вот минимальный воспроизводимый пример.

import tkinter as tk

class auto_haven:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.frame.place(relwidth=1, relheight=1)

        self.admin_login_button = tk.Button(self.frame, text="Admin Login", font=40, command=self.new_window)
        self.admin_login_button.place(relwidth=1, relheight=1)

    def new_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = admin_login(self.newWindow)

class admin_login:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.frame.place(relwidth=1, relheight=1)

        self.login_button = tk.Button(self.frame, text="Login", font=40, command=self.login)
        self.login_button.pack()

        self.back_button = tk.Button(self.frame, text="Exit", font=40, command=self.close_window)
        self.back_button.pack()

    def new_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = admin_panel(self.newWindow)

    def close_window(self):
        self.master.destroy()

    def login(self):
        self.close_window()
        self.new_window()

class admin_panel:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_window)
        self.quitButton.pack()
        self.frame.pack()
    def close_window(self):
        self.master.destroy()

def main():
    root = tk.Tk()
    app = auto_haven(root)
    root.mainloop()

if __name__ == '__main__':
    main()

1 Ответ

1 голос
/ 03 февраля 2020

Когда вы звоните self.login, первое, что он делает, это звонит self.close_window(). Когда вы делаете это, он вызывает self.master.destroy(). Затем он вызывает self.new_window(), что вызывает self.newWindow = tk.Toplevel(self.master).

Обратите внимание, что вы сейчас пытаетесь создать новое окно как дочерний элемент self.master, но вы уничтожили self.master, поэтому tkinter выдаст ошибку. Когда вы создаете новое окно, оно должно быть дочерним по отношению к существующему окну, такому как окно root.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...