Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Перетаскивание геометрических фигур и теги в графике tkinter (Canvas)
Всегда интересные те задачи программирования, где есть и технологическая и алгоритмическая части. Такими обычно являются задачи на программирование графики. Сегодня как раз такая задача на перетаскивания графических фигур и групп фигур.
Перетаскивание одиночной фигуры
Пусть в коне у нас есть некоторая фигура, например овал и наша задача написать программу, позволяющая перетаскивать эту фигуру с помощью мыши. Смысл простой: нажимаем левую кнопку мыши и удерживая её "тащим" фигуру в нужное место.
Ниже (рисунок 1) представлена программа, реализующая перетаскивание фигуры - овала (см. Рисунки 2-3).
Пояснения к программе на рисунке 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().
Перетаскивание группы фигур на Canvas, теги
В библиотеке tkinter реализован механизм тегов. Если номер объекта на холсте является уникальным и однозначно определяет фигуру, то тег может быть одинаковым у группы физуальаных объектов.
Ниже (рисунок 4) представлена программа перетаскивания группы фигур на холсте (см. Рисунки 5-6).
Пояснения к программе
- Программа на рисунке 4 во многом похожа на программу из рисунка 1, но есть важные отличия. Это в первую очередь метки (теги) для каждой фигуры, которые задаются при создании объекта: tags='tg1'. Таким мы все фигуры объединили в одну группу.
- Далее будем обрабатывать события, аналогичные тем, которые обрабатываются в предыдущей программе (см. Рисунок 1), но для заданного тега: Canvas.tag_bind(). Т.е. это сильно облегчает нам ситуацию - не нужно проверять самим, где находится курсор.
- Двигать всю группу тоже просто, так как в методе Canvas.move() указывается именно тег. В остальном алгоритмически программа построена также как предыдущая.
Пока всё! Продолжение следует...
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.