Глава 18 · Инструменты рисования
Ластик
На Canvas «стереть» — не единственно возможное действие. Разберём, какой смысл выбран здесь и почему.
Что вообще значит «стереть» на Canvas?
В графическом редакторе с обычным растровым изображением ластик очевиден: закрасить пиксели цветом фона. Но Canvas хранит не пиксели, а элементы (раздел 18.8) — и у «стереть» здесь есть несколько разных честных значений:
Три честных смысла слова «ластик»
Закрасить область цветом фона
→
ластик = карандаш цветом фона
Удалить весь элемент, которого коснулись
→
нужен hit-test — find_overlapping()
Удалить только часть штриха под курсором
→
сложно: пришлось бы резать элемент на части
Для этого курса выбран первый, самый предсказуемый вариант: ластик — это тот же карандаш (раздел 18.14), только цвет штриха принудительно равен цвету фона холста:
lastik.py
def on_drag(self, event):
tool = self.state.tool
if tool in (Tool.PENCIL, Tool.ERASER):
color = CANVAS_BG if tool is Tool.ERASER else self.state.color
self.canvas.create_line(
self.state.last_x, self.state.last_y, event.x, event.y,
fill=color, width=self.state.width, capstyle=tk.ROUND,
)
self.state.last_x, self.state.last_y = event.x, event.y
Это НЕ настоящее удаление затронутых элементов
Такой ластик рисует НОВЫЙ элемент цвета фона поверх старых — сами старые фигуры остаются в документе, просто визуально перекрыты. Если фон холста когда-нибудь изменится (например, вы добавите фоновое изображение), «стёртые» линии снова станут видны — это не баг, а прямое следствие выбранной модели.
Настоящее удаление — необязательное расширение
Метод
canvas.find_overlapping(x1, y1, x2, y2) находит все элементы в прямоугольной области под курсором ластика — их можно удалить по-настоящему через canvas.delete(item_id). Это честная, но заметно более сложная альтернатива: она требует решить, что делать, если ластик задел только ЧАСТЬ длинной фигуры. В этой главе она не реализована, но упомянута как реальное направление развития.Практика: ластик как штрих цветом фона
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально