Я пытаюсь очистить окно tkinter, однако мне нужен способ очистить все окно сразу, без использования pack.forget.

Любая помощь оценили.

1
Oliver Sinnassamy 27 Авг 2017 в 16:50

3 ответа

Лучший ответ

Вы можете использовать простой рекурсивный цикл для вывода списка всех дочерних виджетов вашего главного окна:

def all_children (window) :
    _list = window.winfo_children()

    for item in _list :
        if item.winfo_children() :
            _list.extend(item.winfo_children())

    return _list

Тогда просто используйте этот список:

widget_list = all_children(window)
for item in widget_list:
    item.pack_forget()
5
TmZn 28 Авг 2017 в 08:43

Что вам нужно сделать, это установить фрейм в главное окно и поместить все, что нужно очистить, в какой-то момент внутри этого фрейма. Тогда вы просто делаете frame_name.destroy()

В следующем примере есть кнопка, которая создает фрейм с несколькими виджетами надписей, и кнопка.

Кнопка вызывает метод, который уничтожит фрейм и все в нем.

Затем вы можете создать кадр снова с первой кнопкой.

Дайте мне знать, если у вас есть какие-либо вопросы:

import tkinter as tk


class ExampleApp(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master = master
        self.some_frame = None

        tk.Button(self.master, text="Create new frame with widgets!", command = self.create_stuff).pack()

    def create_stuff(self):
        if self.some_frame == None:
            self.some_frame = tk.Frame(self.master)
            self.some_frame.pack()

            for i in range(5):
                tk.Label(self.some_frame, text = "This is label {}!".format(i+1)).pack()

            tk.Button(self.some_frame, text="Destroy all widgets in this frame!",
                      command= self.destroy_some_frame).pack()

    def destroy_some_frame(self):
        self.some_frame.destroy()
        self.some_frame = None

root = tk.Tk()
my_example = ExampleApp(root)
root.mainloop()
2
Mike - SMT 28 Авг 2017 в 20:32

Вы можете использовать метод уничтожения для каждого виджета, например, если это кнопка, вы пишете btn1.destroy () и делаете это для всех виджетов. Метод забудьте не рекомендуется, поскольку он удаляет только виджеты.

0
Dr.Geek Nerd 1 Сен 2018 в 21:04