Глава 18 · Инструменты рисования
Геометрия прямоугольника
Мышь можно тянуть в любую из четырёх сторон — прямоугольник должен получиться одинаковым.
Два угла — четыре возможных направления
canvas.create_rectangle(x1, y1, x2, y2) рисует прямоугольник
между двумя точками — но пользователь может тянуть мышь в любую сторону от точки старта:
вниз-вправо, вниз-влево, вверх-вправо, вверх-влево. Прямоугольник получается один и тот же —
Tk сам разбирается, какая координата больше:
Но если координаты нужны и вашему коду — например, чтобы сохранить фигуру в документе (раздел 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