Код: Выделить всё
from tkinter import *
import random
def draw_line(event):
color = random.choice(["red", "blue", "green", "black"])
line_id = canvas.create_line(
last_x, last_y, event.x, event.y, fill=color, width=2)
history.append(line_id)
update_coords(event)
def update_coords(event):
global last_x, last_y
last_x, last_y = event.x, event.y
def undo():
if history:
last_item = history.pop()
canvas.delete(last_item)
root = Tk()
root.title("Test Drawing App")
history = []
last_x, last_y = 0, 0
canvas = Canvas(root, width=400, height=300, bg="white")
canvas.pack()
canvas.bind("", update_coords)
canvas.bind("", draw_line)
btn_undo = Button(root, text="Undo last line", command=undo)
btn_undo.pack()
btn_clear = Button(root, text="Clear All",
command=lambda: canvas.delete("all"))
btn_clear.pack()
root.mainloop()
Если пользователь нажимает «Отменить» после «Очистить все», в списке правильно отображается идентификатор, но Canvas.delete(id) ничего не делает (поскольку объект уже исчез). Что еще более важно, если пользователь снова начнет рисовать, список истории превратится в беспорядок из «призрачных» идентификаторов из предыдущего сеанса и новых идентификаторов.
Мои вопросы:
- Каков наиболее эффективный способ синхронизации моего списка истории с состоянием холста при вызове delete("all")? Должен ли я вручную очистить список или есть ли способ проверить, существует ли идентификатор на холсте, прежде чем вызывать delete()?
- Существует ли риск производительности при хранении тысяч целочисленных идентификаторов в списке Python для длительных сеансов рисования?
Подробнее здесь: https://stackoverflow.com/questions/798 ... void-error
Мобильная версия