Как сделать идентификаторы снова доступными при удалении элементов холста? - PullRequest
0 голосов
/ 13 октября 2019

Я хочу создать, удалить, а затем - снова - создать элементы на холсте. Было бы очень удобно, если бы вновь созданные элементы имели те же идентификаторы, что и ранее.

Я попытался справиться с этим, удалив элементы с canvas.delete(tag), а также отделив элементы с помощью canvas.dtag(dot, ID-of-dot). Отметив, что до сих пор работал. Вот пример, чтобы показать, что я имею в виду:

import tkinter as tk

root = tk.Tk()

x = 0
y = 25

def oval():
    global x, y
    coords = [x-5, y-5, x+5, y+5]
    if x < 40:
        x += 10
    else:
        x = 10
        canv.delete("dots")
    coords = [x - 5, y - 5, x + 5, y + 5]
    canv.create_oval(*coords, tags="dots")

    dot_list = canv.find_withtag("dots")
    txt.delete(1.0, "end")
    txt.insert(0.0, dot_list)

canv = tk.Canvas(root, width=50, height=50)
canv.grid(row=0, column=0)
but1 = tk.Button(root, width=10, height=1, text="Push Me", command=oval)
but1.grid(row=0, column=1)
txt = tk.Text(width=10, height=1)
txt.grid(row=0, column=2)

root.mainloop()

Я хочу, чтобы идентичные идентификаторы (1, 2, 3, 4) повторялись, а не просто продолжали считать, как здесь. Есть ли способ сделать это?

РЕДАКТИРОВАТЬ

Так как кажется, что вы не можете повторно использовать идентификаторы, но для общего решения вы можете использовать подход @martineauи обрабатывать ID-Dict для назначения идентификаторов. Для этого конкретного примера я нашел обходной путь по списку овалов и просто взял в качестве результата счет:

txt.delete(1.0, "end")
for i, dot in enumerate(canv.find_withtag("dots")):
    txt.insert("end", i+1)

1 Ответ

0 голосов
/ 13 октября 2019

Вы не можете повторно использовать идентификаторы холста.

...