没有根的顶级窗口

时间:2021-05-14 15:11:30

标签: python tkinter

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 窗口,但也想销毁根窗口。但我做不到。

2 个答案:

答案 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
相关问题