So I'm trying to delete labels when a button is clicked, but I get an error on doing so.
This is a loop that generates labels based on the list that I have declared earlier.
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
Now I'm trying to delete those labels when I click a button. I have created a print_bill function which has to delete the labels. I tried:
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()
Your problem is this line:
self.pr1 = Label(...).place(x=0, y=t)
What you're basiclly doing in this line, is creating a Label
object, calling .place
on that object in-place, and then assigning the result of the method to self.pr1
. Since Label.place
returns, None
, self.pr1
is assigned to None
.
You need to call the .place
method on the label object, after assigning it to self.pr1
. Otherwise, you loose all references to the Label
object created and it's destroyed.
self.pr1 = Label(...)
self.pr1.place(x=0, y=t)
In other words, Label.place
doesn't work in-place. After doing it's work, it returns no references to the object it was called on.