root = tk.Tk()
root.geometry("400x400")
button = tk.Button(root, text = 'run')
button.pack()
def run2():
new_root = tk.Toplevel()
new_root.geometry("400x500")
label = tk.Label(new_root, text="This is new root")
label.pack()
root.destroy()
new_root.mainloop()
button.config(command = run2)
root.mainloop()
我想创建一个 Toplevel
窗口,但也想销毁根窗口。但我做不到。
答案 0 :(得分:1)
我想创建一个顶层窗口,但也想销毁根窗口。但我做不到。
这是正确的:你做不到。
tkinter 的一个基本方面是小部件存在于一个层次结构中,并且该层次结构必须有一个根节点。如果销毁树中的任何节点,则所有子节点都会自动删除。因此,如果您销毁根窗口,那么根窗口的所有子窗口也将被删除。
没有办法绕过这个事实——必须有一个根窗口。您可以隐藏它,但它仍然必须存在。
答案 1 :(得分:0)
销毁 tk.Tk()
时,也会销毁与该窗口关联的所有小部件/Toplevel
。
要解决您的问题,您有两种选择:
root.withdraw()
而不是 root.destroy()
。这将隐藏窗口而不是破坏它。请注意,它仍会占用内存和计算能力。root.destroy()
,然后使用 new_root = tk.Tk()
创建一个全新的窗口。如果您使用这种方法,您将无法恢复原来的窗口。您的函数将如下所示:def run2():
root.destroy() # Destroy the old window
new_root = tk.Tk() # Create the new window
new_root.geometry("400x500")
label = tk.Label(new_root, text="This is new root")
label.pack()
# new_root.mainloop() # Unneeded - @acw1668