#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 — файл для создания анимации в обратном направлении.