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

Программирование на языке Python. Графика в tkinter (Canvas), элементы анимации

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

Анимация с использованием библиотеки tkinter и Canvas

Мы подошли вплотную к вопросу анимации. Но оказывается у Canvas есть и специфические средства анимированный. В прошлой статье мы использовали вариант Canvas.coords() для задания новых координат объекта. Тем самым можно сделать объект движущимся. Но есть и нечто специфическое. Вот об этом мы сегодня начнём рассказывать.

Ниже (рисунок 1) представлена программа показывающая движение шарика (см. рисунок 2). Первоначально шарик находится в середине окна. По нажатию клавиши Enter он начинает двигаться в начале вправо, ударяется о "стенку", начинает двигаться влево и т.д. По нажатию клавиши ESC он останавливается. Движение снова может быть возобновлено нажатием Enter. В общем такая простая анимация. Но тут важны три механизма: 1. Сам процесс движения. 2. Отскакивание от стенок. 3. Остановка и возобновление движения.

Рисунок 1. Программа с простой анимацией. Текст программы см. ниже по ссылке
Рисунок 1. Программа с простой анимацией. Текст программы см. ниже по ссылке
primer360.py

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

  • Прежде всего обращу внимание на очень полезный метод Canvas.move(), позволяющий двигать объекты, которые расположены на холсте. Нужно указать только сам объект (его номер) и шаги по осям X и Y. Шаги, как вы понимаете могут быть и положительные и отрицательные.
  • Текущее положен ия объекта (координаты верхнего левого и нижнего правого угла прямоугольника, куда вписан объект) можно узнать с помощью метода Canvas.coords(). Получив координаты, мы можем проверить, не достиг ли объект стенки. По достижению стенки мы меняем знак шага (self.dd1) на противоположный. Вот, в сущности, и весь алгоритм движения шарика, который движется от одной стенки к другой.
  • Обращу внимание на переменную self.ex. Эта переменная играет двоякую роль. Не позволяет многократно запускать цикл движения нажатием Enter. С другой стороны эта же переменная позволяет выйти из цикла движения, т.е. остановить объект.

Замечание
Цикл, который мы используем для анимации, можно регулировать, путём использования time.sleep(N) для задержки между шагами - где N - количество секунд, напомню, что N может быть дробной величиной.

С анимацией мы пока не закончили. Продолжим в следующей статье.

Рисунок 2. Окно с движущимся шариком (см. программу из рисунка 1)
Рисунок 2. Окно с движущимся шариком (см. программу из рисунка 1)

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

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

- Сегодня будем заниматься анимацией. - Т.е. будем аниматорами?
- Сегодня будем заниматься анимацией. - Т.е. будем аниматорами?