如何删除从 tkinter 中的循环生成的标签?

How to delete label generated from loop in tkinter?

因此,我尝试在单击按钮时删除标签,但在执行此操作时出现错误。

这是一个循环,它根据我之前声明的列表生成标签。

    t = 150
    i = 0
    for p in products_list:
        self.pr1 = Label(self.right, text=str(products_list[i]), font=('arial 16 bold'), bg='steelblue', fg='white').place(x=0, y=t)
        self.pr2 = Label(self.right, text=(str(quantity_list[i])), font=('arial 16 bold'), bg='steelblue', fg='white').place(x=130, y=t)
        self.pr3 = Label(self.right, text=(str(price_list[i])), font=('arial 16 bold'), bg='steelblue', fg='white').place(x=240, y=t)
        t += 40
        i += 1

现在我尝试在单击按钮时删除这些标签。我创建了一个必须删除标签的 print_bill 函数。我试过了:

def print_bill(self):
    f = open(str(date), "w+")
    f.write("Bill Bill Bill")
    f.close()

    tkinter.messagebox.showinfo("Bill", "Bill Generated Successfully")
    self.pr1.destroy()

你的问题是这一行:

self.pr1 = Label(...).place(x=0, y=t)

你在这一行中所做的基本上是创建一个 Label 对象,就地调用该对象的 .place,然后将方法的结果分配给 self.pr1.由于Label.placereturns,None,self.pr1赋值给None.

您需要在标签对象上调用 .place 方法, 将其分配给 self.pr1 之后。否则,您会丢失对创建的 Label 对象的所有引用,并且它会被销毁。

self.pr1 = Label(...)
self.pr1.place(x=0, y=t)

换句话说,Label.place 不能就地工作。完成工作后,它 returns 没有对调用它的对象的引用。