Глава 18 · История и документ
Очистка холста
Необратимое действие заслуживает подтверждения — и обязано обнулить историю отмены вместе с документом.
«Очистить» — необратимое действие
Кнопка «Очистить холст» удаляет ВЕСЬ рисунок разом. В отличие от Undo, здесь нет предыдущего состояния, к которому можно легко вернуться, — если история отмены тоже очищается вместе с документом. Поэтому перед необратимым действием стоит спросить подтверждение, но только если есть что терять:
ochistka_holsta.py
def clear_canvas(self):
if self.document and not messagebox.askyesno(
"Очистить холст", "Удалить весь рисунок без возможности отмены?"
):
return
self.document.clear()
self.undo_stack.clear()
self.redo_stack.clear()
self.render_document()
Очистка холста, забывшая очистить историю
Если удалить только фигуры (
self.document.clear()), но не тронуть undo_stack, — undo() после очистки внешне не сделает НИЧЕГО (убирать из пустого документа нечего), зато положит устаревшее действие в redo_stack. И тогда Ctrl+Y вернёт на холст фигуры, которые пользователь только что удалил «Очистить». Раздел 18.31 разбирает этот случай отдельно: история обязана обнуляться вместе с документом, который она описывает.Спрашиваем подтверждение не всегда
Если
self.document уже пуст, спрашивать «точно очистить?» не о чем — лишнее диалоговое окно только раздражает. Проверка if self.document and ... пропускает подтверждение именно в этом случае.Практика: безопасная очистка холста
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально