Как синхронизировать список идентификаторов холста Python с Canvas.delete("all"), чтобы избежать ошибок в функции отменыPython

Программы на Python
Ответить
Anonymous
 Как синхронизировать список идентификаторов холста Python с Canvas.delete("all"), чтобы избежать ошибок в функции отмены

Сообщение Anonymous »

Я разрабатываю простое приложение для рисования, используя Tkinter Canvas. Чтобы реализовать функцию Отменить, я сохраняю идентификатор каждого объекта, созданного функцией create_line(), в списке Python под названием History. Когда пользователь нажимает «Отменить», я использую History.pop(), чтобы получить последний идентификатор, а затем Canvas.delete(id), чтобы удалить его с экрана:

Код: Выделить всё

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("all"). После нажатия «Очистить все» холст пуст, но мой список истории по-прежнему содержит все старые идентификаторы.
Если пользователь нажимает «Отменить» после «Очистить все», в списке правильно отображается идентификатор, но Canvas.delete(id) ничего не делает (поскольку объект уже исчез). Что еще более важно, если пользователь снова начнет рисовать, список истории превратится в беспорядок из «призрачных» идентификаторов из предыдущего сеанса и новых идентификаторов.
Мои вопросы:
  • Каков наиболее эффективный способ синхронизации моего списка истории с состоянием холста при вызове delete("all")? Должен ли я вручную очистить список или есть ли способ проверить, существует ли идентификатор на холсте, прежде чем вызывать delete()?
  • Существует ли риск производительности при хранении тысяч целочисленных идентификаторов в списке Python для длительных сеансов рисования?


Подробнее здесь: https://stackoverflow.com/questions/798 ... void-error
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»