Почему метод Canvas.delete() не полностью удаляет id элементов(rectangle, oval, text)?
Всем доброго времени суток, я новичок в tkinter, python. Прошу совета как побороть такую проблему. Для этого я написал 2 маленькие программы, демонстрирующие мое непонимание.
Суть проблемы: На Canvas есть множество разных элементов(фигуры, текст), все они имеют свой id(id_rect = canvas.create_rect(...) или id_text = canvas.create_text(...)
по сути это порядок их отрисовки).Далее я хочу чтобы Canvas очищался по нажатию на кнопку(то есть чтобы я потом нарисовал новые элементы). Но после использования метода canvas.delete() и рисования новых элементов на Canvas, tkinter присваивает элементам последующие номера, то есть не с нового круга.
В дальнейшем я хочу без проблем пользоваться методом canvas.find_withtag('rect')
, который возвращать будет некорректный список id элементов имеющий тег 'rect'
Например: было 10 треугольников(их id =(1...11)), я очистил canvas, нарисовал еще 10 треугольников (их id должны быть тоже (1...11), но их id = (11...21))
Вот простая программа которая это демонстрирует:
import tkinter as tk
import random
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.canvas = tk.Canvas(self, width=400, height=400)
self.canvas.pack()
self.create_widgets()
def create_widgets(self):
self.draw_button = tk.Button(self, text="Draw", command=self.draw_triangle(10))
self.draw_button.pack()
self.clear_button = tk.Button(self, text="Clear", command=self.clear_canvas)
self.clear_button.pack()
def draw_triangle(self,num_triangles):
for _ in range(num_triangles):
x1 = random.randint(0, 400)
y1 = random.randint(0, 400)
x2 = random.randint(0, 400)
y2 = random.randint(0, 400)
x3 = random.randint(0, 400)
y3 = random.randint(0, 400)
self.canvas.create_polygon(x1, y1, x2, y2, x3, y3, tags="rect",
fill=random.choice(["red", "green", "blue"]))
self.canvas.update()
self.canvas.tag_bind("rect", "<Enter>", self.get_id)
def get_id(self, event):
id = self.canvas.find_withtag("current")
print("ID:", id[0])
def clear_canvas(self):
self.canvas.delete("all")
self.canvas.update()
root = tk.Tk()
app = Application(master=root)
app.mainloop()
Зато работает как надо, если метод canvas.delete() заменить на canvas.destroy(), но при таком подходе нужно каждый раз пересоздавать canvas, чего хотелось бы избежать.
Вот переписанная выше программа с методом canvas.destroy()
import tkinter as tk
import random
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
# self.canvas = tk.Canvas(self, width=400, height=400)
# self.canvas.pack()
self.create_widgets()
def create_widgets(self):
# self.canvas = tk.Canvas(self, width=400, height=400)
# self.canvas.pack()
# self.draw_triangle(10)
self.draw_button = tk.Button(self, text="Draw", command=lambda: self.draw_triangle(10))
self.draw_button.pack()
self.clear_button = tk.Button(self, text="Clear", command=self.clear_canvas)
self.clear_button.pack()
def draw_triangle(self,num_triangles):
self.canvas = tk.Canvas(self, width=400, height=400)
self.canvas.pack()
for _ in range(num_triangles):
x1 = random.randint(0, 400)
y1 = random.randint(0, 400)
x2 = random.randint(0, 400)
y2 = random.randint(0, 400)
x3 = random.randint(0, 400)
y3 = random.randint(0, 400)
self.canvas.create_polygon(x1, y1, x2, y2, x3, y3, tags="rect", fill=random.choice(["red", "green", "blue"]))
self.canvas.update()
self.canvas.tag_bind("rect", "<Enter>", self.get_id)
def get_id(self, event):
id = self.canvas.find_withtag("current")
print("ID:", id[0])
def clear_canvas(self):
# self.canvas.delete("all")
self.canvas.update()
self.canvas.destroy()
root = tk.Tk()
app = Application(master=root)
app.mainloop()
Помогите разобраться, спасибо!