tkinter:self.master.destroy()删除两个小部件

时间:2019-06-26 15:03:47

标签: python tkinter

我想要一个程序,单击一个按钮后应打开另一个顶层窗口并删除旧窗口。如果我使用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 个答案:

答案 0 :(得分:1)

删除窗口也会导致其所有子窗口小部件也被破坏。这就是tkinter设计的工作方式。由于您的顶级窗口小部件(和所有窗口小部件)都是根窗口的后代,因此删除根窗口会删除所有窗口小部件。

根据经验,永远不要删除根窗口。当然可以,但是随后您需要创建一个新的根窗口并重新启动mainloop

答案 1 :(得分:0)

@BryanOakley是正确的。相反,您可以退出窗口。 EG:

self.master.withdraw()

这样,根窗口对于用户将是完全不可见的,您可以随时通过以下方式将其恢复:

self.master.deiconify()