我有一个我想要动态更改的Tkinter小部件列表。
如何从窗口中完全删除小部件?
答案 0 :(得分:55)
您可以致电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
隐藏小部件。
答案 1 :(得分:13)
你可以做到的一种方法是从需要清除的框架中获取奴隶清单,并根据您的需要销毁或“隐藏”它们。要获得清晰的框架,您可以这样做:
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()
,具体取决于您将小部件添加到框架的方法。
答案 2 :(得分:2)
您只需使用destroy()
方法删除指定的小部件,如下所示:
lbl = tk.Label(....)
btn = tk.Button(....., command=lambda: lbl.destroy())
使用它可以完全销毁特定的小部件。
答案 3 :(得分:1)
您说您有一个动态更改的小部件列表。您要重用和重新配置现有的小部件,还是创建所有新的小部件并删除旧的小部件?它会影响答案。
如果要重用现有的小部件,只需重新配置它们。或者,如果您只是想暂时隐藏其中的一些,请使用相应的“忘记”方法将其隐藏。如果通过pack()
调用映射了它们,则将通过pack_forget()
(或仅forget()
)个调用来隐藏它们。因此,grid_forget()
隐藏网格化的小部件,place_forget()
隐藏已放置的小部件。
如果您不想重复使用这些小部件,则可以通过直接destroy()
调用来销毁它们,例如widget.destroy()
,以释放资源。
答案 4 :(得分:0)
您可以在小部件上使用遗忘方法
from tkinter import * root = Tk() b = Button(root, text="Delete me", command=b.forget) b.pack() root.mainloop()
答案 5 :(得分: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.
答案 6 :(得分:-1)
我发现当小部件是函数的一部分而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
行。
答案 7 :(得分:-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()
希望它会帮助某人......