【问题标题】:Is there a way to clear all widgets from a tkinter window in one go without referencing them all directly?有没有办法一次性清除 tkinter 窗口中的所有小部件而不直接引用它们?
【发布时间】:2017-08-27 13:50:25
【问题描述】:

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

【问题讨论】:

  • without using pack_forget. 是什么意思?
  • 将它们全部放在一个单独的框架中,并根据需要添加/删除框架?

标签: python tkinter


【解决方案1】:

您可以使用简单的递归循环来列出主窗口的所有子小部件:

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

【讨论】:

    【解决方案2】:

    您可以对每个小部件使用destroy 方法,例如,如果它是一个您编写 btn1.destroy() 并为所有小部件执行此操作的按钮。不推荐使用 forget 方法,因为它只会从外观中删除小部件。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        相关资源
        最近更新 更多