Глава 18 · Инструменты рисования

Живое превью: coords()

Один элемент создаётся один раз и много раз обновляется — вместо потока одноразовых фигур.

Не пересоздавать фигуру на каждое движение

Наивный подход к превью — на каждом <B1-Motion> удалять старую черновую фигуру и создавать новую. Работает, но заставляет Canvas без остановки выбрасывать и заново строить элементы — а заодно теряет любые индивидуальные настройки, которые вы, возможно, ставили только один раз.

on_press: создатьпревью ОДИН разon_drag:coords(preview_id,…on_drag:coords(preview_id,…on_drag:coords(preview_id,…on_release:зафиксировать…
Создать один раз → много раз обновить → зафиксировать (CREATE ONCE → UPDATE MANY TIMES → COMMIT) — один и тот же элемент, а не поток одноразовых.
zhivoe_prevyu.py
def on_press(self, event):
    self.state.preview_id = self.canvas.create_rectangle(
        event.x, event.y, event.x, event.y,
        outline=self.state.color, width=self.state.width, dash=(4, 2),
    )

def on_drag(self, event):
    self.canvas.coords(
        self.state.preview_id,
        self.state.start_x, self.state.start_y, event.x, event.y,
    )
Реальное окно: пунктирный прямоугольник-превью на полпути перетаскивания
Реальное окно: один и тот же элемент preview_id меняет размер на каждый coords() — не создаётся заново.
Реальное окно: пунктирный овал-превью на полпути перетаскивания
Реальное окно: та же самая идея работает и для овала — меняется только форма, которую рисует create_oval().
coords() принимает столько чисел, сколько нужно фигуре
Для линии и прямоугольника — четыре числа (две точки). Для многоточечной ломаной (например, растущего карандашного контура) — сколько угодно пар x, y. Главное — вызывать coords() с тем же item_id, что вернул исходный create_*.
Практика: живое превью через coords()
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →