有没有一种方法可以一次性从 tkinter 窗口中清除所有小部件,而无需直接全部引用它们?

新手上路,请多包涵

我正在尝试完全清除 tkinter 窗口。但是,我需要一种方法来一次性清除窗口中的每个小部件,而无需使用 pack.forget()

原文由 Oliver Sinnassamy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 882
2 个回答

您可以使用一个简单的递归循环来列出主窗口的所有子 wigets:

 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()

原文由 TmZn 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要做的是为您的主窗口设置一个框架,并将所有要清除的内容放在该框架内的某个位置。然后你只需做 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()

原文由 Mike - SMT 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏