【发布时间】:2017-08-27 13:50:25
【问题描述】:
我正在尝试完全清除 tkinter 窗口。但是,我需要一种方法来一次清除窗口上的每个小部件,而不使用 pack.forget()。
【问题讨论】:
-
without using pack_forget.是什么意思? -
将它们全部放在一个单独的框架中,并根据需要添加/删除框架?
我正在尝试完全清除 tkinter 窗口。但是,我需要一种方法来一次清除窗口上的每个小部件,而不使用 pack.forget()。
【问题讨论】:
without using pack_forget. 是什么意思?
您可以使用简单的递归循环来列出主窗口的所有子小部件:
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()
【讨论】:
您可以对每个小部件使用destroy 方法,例如,如果它是一个您编写 btn1.destroy() 并为所有小部件执行此操作的按钮。不推荐使用 forget 方法,因为它只会从外观中删除小部件。
【讨论】:
您需要做的是为您的主窗口设置一个框架,并在该框架内的某个位置放置要清除的所有内容。然后你只需做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()
【讨论】: