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

Геометрия прямоугольника

Мышь можно тянуть в любую из четырёх сторон — прямоугольник должен получиться одинаковым.

Два угла — четыре возможных направления

canvas.create_rectangle(x1, y1, x2, y2) рисует прямоугольник между двумя точками — но пользователь может тянуть мышь в любую сторону от точки старта: вниз-вправо, вниз-влево, вверх-вправо, вверх-влево. Прямоугольник получается один и тот же — Tk сам разбирается, какая координата больше:

X →Y ↓(0, 0)стартсейчас
вниз-вправо
X →Y ↓(0, 0)стартсейчас
вниз-влево
X →Y ↓(0, 0)стартсейчас
вверх-вправо
X →Y ↓(0, 0)стартсейчас
вверх-влево

Но если координаты нужны и вашему коду — например, чтобы сохранить фигуру в документе (раздел 18.13) с предсказуемым порядком точек, — стоит явно привести их к одному виду:

normalize_bounds.py
def normalize_bounds(x1, y1, x2, y2):
    """Приводит две произвольные противоположные точки к (left, top, right, bottom)."""
    return min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)
Canvas это уже делает сам, а normalize_bounds() — для вашего кода
create_rectangle() прекрасно рисует прямоугольник, даже если x1 > x2 — сам Tk не путается в направлении. normalize_bounds() нужна не Canvas, а вашей модели документа: чтобы одна и та же фигура, нарисованная в любую сторону, сохранялась в JSON (раздел 18.30) в одном и том же предсказуемом виде.
Практика: normalize_bounds() для всех направлений перетаскивания
Автоматическая проверка — приводим координаты к (left, top, right, bottom) без Tkinter
Открыть практику →