Как уничтожить все открытые окна tkinter toplevel - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть несколько строк кода, открывающих 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 ]

0 голосов
/ 28 декабря 2018

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

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()
0 голосов
/ 28 декабря 2018

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

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