Почему метод 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()

Помогите разобраться, спасибо!


Ответы (0 шт):