61

我有一个tkinter想要动态更改的小部件列表。

如何从窗口中删除小部件?

4

8 回答 8

102

您可以调用pack_forget以删除一个小部件(如果您使用pack将其添加到窗口中)。

例子:

from tkinter import *

root = Tk()

b = Button(root, text="Delete me", command=lambda: b.pack_forget())
b.pack()

root.mainloop()

如果您使用pack_forget,您可以稍后再次显示小部件再次调用pack。如果您想永久删除它,请调用destroy小部件(然后您将无法重新添加它)。

如果您使用该grid方法,您可以使用或grid_forget隐藏部件。grid_remove

于 2012-09-11T07:49:10.860 回答
24

您可以这样做的一种方法是从需要清除的框架中​​获取从属列表,并根据您的需要销毁或“隐藏”它们。要获得清晰的框架,您可以这样做:

from tkinter import *

root = Tk()

def clear():
    list = root.grid_slaves()
    for l in list:
        l.destroy()

Label(root,text='Hello World!').grid(row=0)
Button(root,text='Clear',command=clear).grid(row=1)

root.mainloop()

您应该调用grid_slaves(),pack_slaves()slaves()取决于您用于将小部件添加到框架的方法。

于 2017-07-06T17:28:31.863 回答
5

您只需使用该destroy()方法删除指定的小部件,如下所示:

lbl = tk.Label(....)

btn = tk.Button(....., command=lambda: lbl.destroy())

使用它,您可以完全销毁特定的小部件。

于 2020-01-05T17:18:47.090 回答
1

您说您有一个要动态更改的小部件列表。您想重用和重新配置现有的小部件,还是创建所有新的小部件并删除旧的小部件?它影响答案。

如果您想重用现有的小部件,只需重新配置它们。或者,如果你只是想暂时隐藏其中一些,使用相应的“忘记”方法来隐藏它们。如果你用调用映射它们,你会用(或只是)调用pack()隐藏。因此,隐藏网格小部件和放置的小部件。pack_forget()forget()grid_forget()place_forget()

如果您不打算重复使用这些小部件,您可以通过直接destroy()调用来销毁它们,例如widget.destroy(),以释放资源。

于 2020-02-27T01:21:30.197 回答
0

clear_btm=Button(master,text="Clear") #this button will delete the widgets 
clear_btm["command"] = lambda one = button1, two = text1, three = entry1: clear(one,two,three) #pass the widgets
clear_btm.pack()

def clear(*widgets):
    for widget in widgets:
        widget.destroy() #finally we are deleting the widgets.
于 2020-06-24T10:53:35.553 回答
-1

您可以在小部件上使用忘记方法

from tkinter import *

root = Tk()

b = Button(root, text="Delete me", command=b.forget)
b.pack()

b['command'] = b.forget

root.mainloop()
于 2018-05-22T11:24:27.237 回答
-1

今天我在python3中使用tkinter gui库学习了一些简单而好的点击事件处理,我想在这个线程中分享。

from tkinter import *

cnt = 0


def MsgClick(event):
    children = root.winfo_children()
    for child in children:
        # print("type of widget is : " + str(type(child)))
        if str(type(child)) == "<class 'tkinter.Message'>":
            # print("Here Message widget will destroy")
            child.destroy()
            return

def MsgMotion(event):
  print("Mouse position: (%s %s)" % (event.x, event.y))
  return


def ButtonClick(event):
    global cnt, msg
    cnt += 1
    msg = Message(root, text="you just clicked the button..." + str(cnt) + "...time...")
    msg.config(bg='lightgreen', font=('times', 24, 'italic'))
    msg.bind("<Button-1>", MsgClick)
    msg.bind("<Motion>", MsgMotion)
    msg.pack()
    #print(type(msg)) tkinter.Message


def ButtonDoubleClick(event):
    import sys; sys.exit()


root = Tk()

root.title("My First GUI App in Python")
root.minsize(width=300, height=300)
root.maxsize(width=400, height=350)
button = Button(
    root, text="Click Me!", width=40, height=3
)
button.pack()
button.bind("<Button-1>", ButtonClick)
button.bind("<Double-1>", ButtonDoubleClick)

root.mainloop()

希望它会帮助某人...

于 2017-10-26T16:08:37.780 回答
-2

我发现当小部件是函数的grid_remove一部分并且是另一个函数的一部分时,它不会删除标签。在这个例子中...

def somefunction(self):
    Label(self, text=" ").grid(row = 0, column = 0)
    self.text_ent = Entry(self)
    self.text_ent.grid(row = 1, column = 0)
def someotherfunction(self):
    somefunction.text_ent.grid_remove()

...没有删除标签的有效方法。

我能找到的唯一解决方案是为标签命名并使其全局化:

def somefunction(self):
    global label
    label = Label(self, text=" ")
    label.grid(row = 0, column = 0)
    self.text_ent = Entry(self)
    self.text_ent.grid(row = 1, column = 0)
def someotherfunction(self):
    global label
    somefunction.text_ent.grid_remove()
    label.grid_remove()

当我遇到这个问题时,涉及到一个类,一个函数在类中,一个不在,所以我不确定global label上面是否真的需要这些行。

于 2013-06-06T11:37:27.430 回答