tkinter: self.master.destroy () удаляет два виджета - PullRequest
1 голос
/ 26 июня 2019

Я хочу иметь программу, которая при нажатии на кнопку должна открывать другое окно верхнего уровня и удалять старое окно. Если я использую self.master.destroy (), он, по-видимому, удаляет старое окно в дополнение к немедленному удалению нового окна. Как я могу уничтожить старое окно, сохранив новое окно без изменений?

import tkinter as tk

class DirSearch:
    def __init__(self,master):
        self.master = master

        self.goButton = tk.Button(master,text="Go!", command=self.openDir)
        self.goButton.grid(row=2)

    def openDir(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = DirView(self.newWindow)
        #self.master.destroy() This would destroy the new window as well as the old one

class DirView:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.label = tk.Label(master, text = "foo")
        self.label.grid()
        self.button = tk.Button(master, text="bar")
        self.button.grid()

if __name__ == '__main__':
    root = tk.Tk()
    app = DirSearch(root)
    root.mainloop()

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Удаление окна приведет к уничтожению всех его дочерних виджетов.Так работает tkinter.Поскольку ваш виджет верхнего уровня (и все виджеты) являются потомками корневого окна, удаление корневого окна удаляет все виджеты.

Как правило, вы никогда не должны удалять корневое окно.Вы можете, конечно, но тогда вам нужно будет создать новое корневое окно и перезапустить mainloop.

0 голосов
/ 27 июня 2019

@ Брайан Окли прав.Вместо этого вы можете снять окно.EG:

self.master.withdraw()

Таким образом, корневое окно будет полностью невидимым для пользователя, и вы можете вернуть его в любое время с помощью:

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