如何删除框架中的所有标签而不删除框架本身?

时间:2020-01-01 05:47:35

标签: python tkinter

我试图通过将每个Label附加到列表中来完成此操作。

for tasks in range(0, num_tasks):
    stat = 'IDLE'
    active_labels.append(
        Label(page2, text=rr, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(x=ys_adi1,
                                                                                        y=ys_adi3))
    rr = rr + 1
    active_labels.append(
        Label(page2, text=rr, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(x=ys_adi2,
                                                                                        y=ys_adi4))

    active_labels.append(
        Label(page2, text=page_name1, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(x=name1,
                                                                                                y=name3))
    active_labels.append(
        Label(page2, text=page_name2, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(x=name2,
                                                                                                y=name4))

    active_labels.append(
        Label(page2, text=proxy_address, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(x=mm,
                                                                                                   y=mn))
    Label(page2, text=proxy_address, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(x=mm,
                                                                                               y=mna)

    status_label1 = Label(page2, text=stat, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(
        x=stat1, y=status_in1)
    active_labels.append(status_label1)

    status_label2 = Label(page2, text=stat, bg='#1C2833', fg='#FDFEFE', font=("Helvetica", 10)).place(
        x=stat2, y=status_in2)
    active_labels.append(status_label2)

并使用for循环遍历列表和每个.delete()。

for label in active_labels:
    Label.destroy(label)

这可悲地是行不通的,即时消息再次卡在了如何解决这个问题上。

2 个答案:

答案 0 :(得分:1)

您可以在winfo_children()小部件上使用frame,然后销毁每个child小部件。

以下是示例:

import tkinter as tk

window = tk.Tk()

frame = tk.Frame(window)
frame.grid(row=0, column=0)

for i in range(10):
    tk.Label(frame, text=f'Label {i}').grid(row=i, column=0)

window.mainloop()

上面的代码将在10内制作frame标签小部件

10 labels

现在,在此winfo_children()上使用frame来获取每个child label widget并销毁它们,然后在GUI中查看内容

import tkinter as tk

window = tk.Tk()

frame = tk.Frame(window)
frame.grid(row=0, column=0)

for i in range(10):
    tk.Label(frame, text=f'Label {i}').grid(row=i, column=0)

# get the children widget and destroy them
for label in frame.winfo_children():
    label.destroy()

window.mainloop()

这将破坏label内的所有frame小部件并返回一个empty GUI

empty gui

答案 1 :(得分:1)

代码的问题在于您要保存到active_labels的内容。如果您对其进行检查,您将只会看到None值列表。这是因为Label(...).place(...)总是返回None

第一步是将窗口小部件的创建和窗口小部件的布局分开,以便您的active_labels列表准确地包含所有标签。然后,您可以通过在每个标签上调用destroy在循环中将其删除:

for label in active_labels:
    label.destroy()

另一种解决方案是不用担心维护列表。任何小部件都可以返回其子级列表,因此您只需在该列表上循环即可:

for label in page2.winfo_children():
    label.destroy()

注意:这假设您实际上是将标签放在page2中,并且没有犯同样的错误,并且page2设置为None