Глава 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
Практика выполняется локально
Открыть практику →