Управление анимацией заархивированной последовательности PNG в Киви

#python #python-3.x #kivy #kivy-language #kivymd

Вопрос:

Я пытаюсь создать плеер, который воспроизводит последовательности png, хранящиеся в zip, и я хочу иметь возможность управлять воспроизведением.

Например, все мои молнии будут иметь 90 png, когда плеер загрузится, я хочу, чтобы анимация остановилась на изображении 45. Когда пользователь проводит пальцем вправо, игрок должен воспроизвести несколько png, создавая иллюзию «быстрой переадресации».

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

Как я могу заставить kivy загружать последовательность изображений из середины последовательности, управлять воспроизведением вперед и воспроизведением в обратном порядке?

 from kivy.core.window import Window
from kivy.lang import Builder
from kivymd.app import MDApp
Window.size = (440, 760)

kv = '''

#:import hex kivy.utils.get_color_from_hex
MDScreen:
    MDGridLayout:
        cols: 1
        Image:
            id: display_image
            source: 'video/sophia.zip'
            anim_delay: 1/30
            anim_reset: True
            size_hint_y:None
            height: 480
'''


class PNGPlayer(MDApp):
    def build(self):
        return Builder.load_string(kv)

if __name__== '__main__':
    PNGPlayer().run()
 

Ответ №1:

Вы можете управлять анимацией, используя anim_delay свойство Image . Установка этого значения -1 остановит анимацию, а установка этого значения 1/30 перезапустит ее с той же скоростью, что и раньше. Вот измененная версия вашего кода, которая демонстрирует, что:

 from kivy.clock import Clock
from kivy.core.window import Window
from kivy.lang import Builder
from kivymd.app import MDApp
Window.size = (440, 760)

kv = '''

#:import hex kivy.utils.get_color_from_hex
MDScreen:
    MDGridLayout:
        cols: 1
        Image:
            id: display_image
            source: 'video/sophia.zip'
            anim_delay: 1/30
            anim_reset: True
            size_hint_y:None
            height: 480
'''


class PNGPlayer(MDApp):
    def build(self):
        root = Builder.load_string(kv)
        self.delay = root.ids.display_image.anim_delay
        Clock.schedule_once(self.stop_anim, 45*self.delay)  # stop after 45 frames
        return root

    def stop_anim(self, dt):
        print('stopping animation')
        self.root.ids.display_image.anim_delay = -1
        Clock.schedule_once(self.restart_anim, 5)

    def restart_anim(self, dt):
        print('restarting animation')
        self.root.ids.display_image.anim_delay = self.delay

if __name__== '__main__':
    PNGPlayer().run()
 

Комментарии:

1. Спасибо тебе, Джон! Это работает, однако, я хотел бы также изменить анимацию, возможно ли это?

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