Как уничтожить все открытые окна tkinter toplevel

У меня есть несколько строк кода, который открывается tkinter toplevel window которые можно уничтожить, нажав на destroy all button, Задача, когда я открываю несколько окон и хочу уничтожить все, уничтожается только одно. Попробовал quit функция, но она закрывает все окно, включая root window, Я только хочу, чтобы все окна верхнего уровня были уничтожены.

import tkinter as tk




def open_window():
    global top1
    top1 = tk.Toplevel()

    top1.geometry("100x100")


def destroy_all():
    top1.destroy()



root = tk.Tk()
root.geometry("500x500")


b1 = tk.Button(root, text="open", command=open_window)
b1.pack(side=tk.TOP)


b2 = tk.Button(root, text="destroy all", command=destroy_all)
b2.pack(side=tk.BOTTOM)


root.mainloop()

2 ответа

Вы можете перебрать все созданные вами виджеты и уничтожить те, которые Toplevels

def destroy_all():
    for widget in root.winfo_children():
        if isinstance(widget, tk.Toplevel):
            widget.destroy()

Мне нравится использовать список при работе с динамически генерируемыми виджетами / контейнерами. Здесь я бы использовал список, чтобы удерживать Топлевел, а затем уничтожать каждый Топлевел в списке.

import tkinter as tk


def open_window():
    list_of_tops.append(tk.Toplevel(root))
    list_of_tops[-1].geometry("100x100")


def destroy_all():
    for top_window in list_of_tops:
        top_window.destroy()

root = tk.Tk()
root.geometry("500x500")
list_of_tops = [] # list to store any toplevel window.
tk.Button(root, text="open", command=open_window).pack(side=tk.TOP)
tk.Button(root, text="destroy all", command=destroy_all).pack(side=tk.BOTTOM)
root.mainloop()
Другие вопросы по тегам