Найти в Дзене
programmer's notes (python and more)

Программирование на языке Python. Графика в tkinter (Canvas), перетаскивание графических фигур, теги

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Перетаскивание геометрических фигур и теги в графике tkinter (Canvas)

Всегда интересные те задачи программирования, где есть и технологическая и алгоритмическая части. Такими обычно являются задачи на программирование графики. Сегодня как раз такая задача на перетаскивания графических фигур и групп фигур.

Перетаскивание одиночной фигуры

Пусть в коне у нас есть некоторая фигура, например овал и наша задача написать программу, позволяющая перетаскивать эту фигуру с помощью мыши. Смысл простой: нажимаем левую кнопку мыши и удерживая её "тащим" фигуру в нужное место.

Ниже (рисунок 1) представлена программа, реализующая перетаскивание фигуры - овала (см. Рисунки 2-3).

Рисунок 1. Программа перетаскивания одиночной фигуры. Текст программы см. ниже по ссылке
Рисунок 1. Программа перетаскивания одиночной фигуры. Текст программы см. ниже по ссылке
primer362.py

Пояснения к программе на рисунке 1

  • Прежде хотелось бы обратить внимание на алгоритмический элемент программы. В tkinter есть событие перетаскивания левой кнопкой мыши: <B1-Motion>, но тут важно знать шаг движения. Для этого нужно отлавливать шаги движения курсора мыши. Первый положение курсора определяется событием <Button-1>, т.е. начальным положением курсора перед перетаскиванием. А потом уже вычитать предыдущее положение курсора из последующего. В глобальных переменных xx и yy всегда будет хранится предыдущее положение курсора, если он находится в области фигуры.
  • И щелчок мыши и перетаскивание должно срабатывать если курсор находится в пределах фигуры (описанного прямоугольника): if x > x1 and x < x2 and y > y1 and y < y2. При этом координаты фигуры определяются известным уже нам способом x1, y1, x2, y2 = self.cnv.coords(self.ovl).
  • Зная предыдущее и последующее положение мы определяем шаг, который используется в методе Canvas.move().
Рисунок 2. Исходное состояние
Рисунок 2. Исходное состояние
Рисунок 3. Положение после перетаскивания (см. рисунок 2)
Рисунок 3. Положение после перетаскивания (см. рисунок 2)

Перетаскивание группы фигур на Canvas, теги

В библиотеке tkinter реализован механизм тегов. Если номер объекта на холсте является уникальным и однозначно определяет фигуру, то тег может быть одинаковым у группы физуальаных объектов.

Ниже (рисунок 4) представлена программа перетаскивания группы фигур на холсте (см. Рисунки 5-6).

Рисунок 4. Программа с перетаскиванием группы фигур на холсте с использованием тега. Полный текст программы см. ниже по ссылке
Рисунок 4. Программа с перетаскиванием группы фигур на холсте с использованием тега. Полный текст программы см. ниже по ссылке
primer363.py

Пояснения к программе

  • Программа на рисунке 4 во многом похожа на программу из рисунка 1, но есть важные отличия. Это в первую очередь метки (теги) для каждой фигуры, которые задаются при создании объекта: tags='tg1'. Таким мы все фигуры объединили в одну группу.
  • Далее будем обрабатывать события, аналогичные тем, которые обрабатываются в предыдущей программе (см. Рисунок 1), но для заданного тега: Canvas.tag_bind(). Т.е. это сильно облегчает нам ситуацию - не нужно проверять самим, где находится курсор.
  • Двигать всю группу тоже просто, так как в методе Canvas.move() указывается именно тег. В остальном алгоритмически программа построена также как предыдущая.
Рисунок 5. Исходное состяние.
Рисунок 5. Исходное состяние.
Рисунок 6. Положение после перетаскивания (см. Рисунок 5)
Рисунок 6. Положение после перетаскивания (см. Рисунок 5)

Пока всё! Продолжение следует...

Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Представляете как снимались мультфильмы скажем году в 1950?
Представляете как снимались мультфильмы скажем году в 1950?