Как сделать анимацию загрузки в python
Перейти к содержимому

Как сделать анимацию загрузки в python

Загрузка анимации в python

Я новичок в Python, и мне было интересно, как сделать анимацию загрузки во время работы моей программы. Мне это нужно, потому что я не хочу, чтобы пользователи думали, что программа зашла в тупик. Я предпочитаю что-то вроде .

Загрузка . (точки исчезают и появляются одна за другой)

2 ответа

Если ваше окно вывода поддерживает символ возврата каретки, вы можете напечатать его, чтобы курсор возвращался к началу текущей строки (при условии, что вы завершили оператор print запятой, поэтому символ новой строки не печатается автоматически ) . Затем последующие распечатки перезапишут то, что уже было напечатано. Вы можете использовать это, чтобы сделать очень простую однострочную анимацию. Пример:

. Где time.sleep(1) — это заполнитель, представляющий фактическую работу, которую вы хотите сделать.

Затем, через секунду:

Затем, через секунду:

Затем, через секунду:

Затем, через секунду:

Примечание о совместимости: в 3.X print больше не является оператором, а трюк «конец с запятой» больше не работает. Вместо этого укажите параметр end :

Самый правильный способ сделать это — использовать многопоточность.

Вы бы инициировали поток, который начинает отображать некоторое указание на то, что программа что-то делает, а затем открыл новый поток, который фактически выполняет эту работу.

Когда поток, выполняющий работу, закончен, вы можете перейти к тому, что еще делает программа.

Это выглядит нормально при запуске в командной строке Windows, но не уверен, что Linux понравится:

Создание анимации с Python и Pygame

Создание анимации с Python и Pygame

Создание анимации достаточно увлекательное занятие. И Python как нельзя лучше подходит для этого. Фреймворк Pygame уже содержит встроенные методы работы с анимацией.

Мы будем создавать анимацию с помощью последовательности кадров. Каждый кадр будет взят из общего изображения — атласа спрайтов. При помощи метода subsurface содержащимся в Pygame мы будем делить изображение на части и записывать их в список. Все это будет производиться в цикле.

Скачаем изображение с любым персонажем, например:

Изображение

Создадим файл image_animation.py:

import pygame
from pygame.constants import QUIT, K_ESCAPE, KEYDOWN

# pygame.constants необходим для создания условия выхода из цикла

# далее создаем функцию my_animation, принимающая следующие аргументы w1, h1 — количество спрайтов в строке и столбце изображения, k — это общее количество кадров в изображении, fps — количество кадров в секунду, name — название и путь к изображению, position — положение анимации на игровом экране.

def my_animation( w1, h1, k, fps, name, position):
# список для хранения кадров и таймер
frames = []
timer = pygame.time.Clock()

# создаем экран и загружаем изображение в переменную sprite, установив методом convert_alpha необходимую прозрачность
scr = pygame.display.set_mode( ( 800, 800 ), 0, 32 )
sprite = pygame.image.load( "<0>.png".format(name) ).convert_alpha()

# находим длину, ширину изображения и размеры каждого кадра
width, height = sprite.get_size()
w, h = width/w1, height/h1

# счетчик положения кадра на изображении
row = 0

# итерация по строкам
for j in range(int(height/h)):
# производим итерацию по элементам строки
for i in range( int( width / w ) ):
# добавляем в список отдельные кадры
animation_frames.append(image.subsurface(pygame.Rect(i * w, row, w, h ) ) )
# смещаемся на высоту кадра, т.е. переходим на другую строку
row += int(h)

# счетчик
counter = 0

while True:
# условие выхода из цикла — нажатие клавиши ESCAPE
for evt in pygame.event.get():
if evt.type == QUIT or ( evt.type == KEYDOWN and evt.key == K_ESCAPE ) :
sys.exit()
# заполняем игровое поле красным цветом и методом blit вырисовываем на поверхности
scr, c координатами position, вырезанную часть изображения
scr.fill( ( 255, 0, 0 ) )
scr.blit( animation_frames[counter], position )

# счетчик используемый как индекс в списке увеличивается до того как не превысит
общее количество кадров, после чего цикл повторяется
counter = ( counter + 1 ) % k

# обновляем экран
pygame.display.update()
timer.tick(fps)

if __name__ == "__main__":
x = float(input("Fps:"))
my_animation(12, 4, 48, x, "image", (300, 300))

Создание GIF анимации из кадров в Python + Pillow: пошаговая инструкция

Существует множество ситуаций, когда могут быть полезными анимации. Они позволяют сделать приложение более привлекательным для пользователя, сделать его дизайн приятным. А если программа решает коммерческую задачу, то анимации могут непосредственно повлиять на конверсию. Сегодня поговорим об особенностях создания анимаций с помощью библиотеки Pillow для Python.

Когда может использоваться анимация?

К слову, анимация создается не только для красоты. Более того, это – не главное ее назначение. Из-за этого огромное количество людей не понимают, как ее правильно использовать.

Основная задача анимации – сделать интерфейс удобным. В основе взаимодействия с программой должна быть имитация реального мира. Типичный пример – кнопка. Когда человек ее нажимает, она как бы «проседает» в специальном отсеке.

В компьютерной программе кнопка имеет, по сути, то же назначение, что и в реальном мире. И анимация кнопки была изначально создана для того, чтобы имитировать взаимодействие с реальными объектами, и тем самым сделать приложение интуитивно понятным.

Но даже после отказа от скевоморфизма (дизайнерской концепции, по которой интерфейсы приложений должны были напоминать реальные объекты), анимация остается совместимой с современными программами. Получается реализовать сразу две задачи:

  1. Создать ощущение работы с реальным миром.
  2. Оставить как можно меньше интерфейса, который затрудняет пользовательский опыт.

Анимация может использоваться в самых разных точках взаимодействия с пользователям:

  1. Приветствия.
  2. Анимация загрузки. Они позволяют наглядно понимать, сколько приблизительно времени осталось до загрузки того или иного приложения. Также они дают возможность понять, что вообще эта загрузка происходит, а не просто зависла программа.
  3. Информативность. Например, анимированные меню могут давать возможность больше информации получить без необходимости дополнительного скроллинга.
  4. Предоставление обратной связи пользователям.
  5. Подсказки и уведомления. Анимация позволяет их выделить на фоне других элементов интерфейса.

Таким образом, с помощью анимаций можно решать целый спектр практических задач, сделав взаимодействие пользователей с приложением более понятным.

Базовые принципы имитации реального мира

Каким образом анимация имитирует реальный мир? Есть три базовых принципа:

  1. Физическая модель. В ходе разработки интерфейса дизайнеру необходимо создать физическую модель, согласно которой будут двигаться все элементы. Типичный пример такой модели – при наведении мышью на кнопку она заполняется цветом и становится визуально тяжелее. С использованием анимации интерфейса человек понимает, что это – интерактивный элемент.
  2. Контекст, связь. Иллюзия живого взаимодействия создается за счет связи между разными состояниями интерфейса. Например, вы решили почитать книгу. Когда прочитали страницу, вы переворачиваете ее. Это привычно для человека, позволяет связывать одну страницу с другой. Вот анимация перелистывания позволяет создать такую имитацию реального чтения книги.
    Типичный пример хорошей имитации реального мира – «вырастание» приложений из их иконки на рабочем столе в устройствах под управлением iOS и некоторых смартфонах под управлением Android. Это позволяет интуитивно улавливать связь между иконкой программы и непосредственно ее интерфейсом.
  3. Взаимодействие. Те, кто пользовались программой для прогноза погоды на iOS, знают, что там есть анимация грозы или движения туч. Это хорошая логика, поскольку люди привыкли смотреть погоду в окне. Таким образом, программа превращается в реальное окно в реальный мир, где текущая погода видна сразу.

Создание простого GIF из кадров

Самый популярный формат анимированных изображений – GIF. Допустим, у нас есть 10 кадров, где Гомер Симпсон бежит. Наша задача – объединить их в целый GIF-файл.

Скачать архив можно по ссылке .

Далее наша задача технически сводится к тому, чтобы перебрать каждый кадр. Для этого необходимо воспользоваться циклом for и range . С их помощью мы откроем каждый кадр и добавим его объект в специальный список.

Получим такой результат.

Далее мы обсудим все параметры метода save () объекта Image . Но сначала давайте отрегулируем количество времени, в течение которого каждый кадр будет отображаться по отдельности. Для этого у нас существует параметр duration. Ему надо передать список с целочисленными значениями (то есть, время отображения в миллисекундах) для каждого кадра по отдельности.

Теперь наш Гомер начал бегать медленнее. Но обратите внимание, что в нашей анимации теперь он бегает сначала медленно, а потом ускоряется. Все потому, что первые три кадра имеют по 100, 150 и 200 миллисекунд на отображение соответственно. А все остальные также отображаются все меньшее количество времени.

Использование метода Image.save() для сохранения GIF-файла

Метод Image.save используется для того, чтобы создать из нескольких картинок одну анимированную в формате GIF.

Список с изображениями [im1, im2, …] прикрепляется к первому кадру, а далее из всех этих картинок создается анимация. В нашем случае файл будет называться out.gif , поскольку именно это имя находится в качестве первого аргумента этого метода.

А теперь давайте разберем пример кода, в котором будут описаны все параметры.

Генерация анимированной картинки

Теперь давайте рассмотрим такой код. Он предназначен для рисования круга, который будет становиться все больше и больше. Для этого нам надо задействовать библиотеку ImageDraw из библиотеки PIL.

Также этот код сохраняет GIF-файл.

Метод Image.save() – параметры

В результате, если у нас имеется список изображений, то с помощью этого кода появляется возможность создать анимированную картинку.

Если вам нужно сгенерировать GIF-файл (гифку) из нескольких картинок, которые уже существуют вместо того, чтобы рисовать картинку так, как в приведенном выше примере, то то же самое можно сделать путем загрузки изображений и последующего добавления их в список.

append_images – как использовать этот параметр?

Для этого нам нужно вызвать метод save() и передать список с другими изображениями параметру append_images .

Учтите, что, если вы напишете append_images=images, в этом случае будет осуществляться повторение первого кадра два раза. В приведенном выше фрагменте кода вторая картинка и все, которые будут следовать за ней, выбираются с помощью среза images[1:].

optimize

Этот параметр отвечает за то, нужно ли сжимать палитру. Если его значение – True , то Pillow удалит неиспользуемые цвета, и таким образом попробует уменьшить количество доступных вариантов. Это поможет уменьшить вес изображения.

Этот параметр отвечает за количество циклов, выполняющихся GIF-анимацией. Можно сделать цикл бесконечным. Для этого необходимо указать значение этого параметра 0.

Учтите то, что стандартно установлен один цикл для анимации. Следовательно, оптимальное значение составляет именно 0.

duration

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

Ему можно передать список с индивидуальной продолжительностью отображения для каждого отдельного кадра в приложении.

Выводы

Таким образом, работа с анимацией – это вовсе несложно. Не нужно сильно затруднять этот процесс, задавая миллионы строк кода. Достаточно лишь сгенерировать готовую анимацию, а дальше ее можно использовать.

Это же позволяет создавать целый класс программ, таких как приложения для создания мультфильмов.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *