Как запустить несколько анимаций одновременно в Kivy? - PullRequest
0 голосов
/ 22 марта 2020

Цель:

  • Чтобы запустить сразу несколько анимаций.

Ожидаемый результат:

  • Все анимации определены и Запущенный сразу должен выполняться параллельно.


Фактический результат:

  • Единственная анимация, которая была запущена первой, показывает следующие анимации даже не запускается.


Код для справки:

class KivySplash(Screen):
    def __init__(self, **kwargs):
        super(KivySplash, self).__init__(**kwargs)
        anim1 = MyAnimation(duration=4, opacity=0)
        anim1.bind(on_complete=self.on_anim1_complete)
        self.animation = MyAnimation(duration=3) + MyAnimation(duration=4, opacity=1) + MyAnimation(duration=5) + anim1
        self.img1 = Image(source=os.path.join(original_dir, "Kivy-logo-black-512.png"), opacity=0)
        self.img2 = Image(source=os.path.join(original_dir, "python-powered-w-200x80.png"))
        self.label1 = Label(text="Powered by:", font_size=48)
        box_layout = BoxLayout(orientation="vertical")
        box_layout1 = BoxLayout()
        box_layout.add_widget(self.label1)
        box_layout1.add_widget(self.img1)
        box_layout1.add_widget(self.img2)
        box_layout.add_widget(box_layout1)
        self.add_widget(box_layout)

    def on_anim1_complete(self, *args):
        do_nothing(self, *args)
        if self.img1 in self.animation.animated_widgets:
            pass

    def on_enter(self, *args):
        self.animation.start(self.img1)
        self.animation.start(self.img2)


Благодарю вас.

1 Ответ

1 голос
/ 22 марта 2020

Я полагаю, вы столкнулись с ошибкой в ​​kivy Animation. Если вы просто используете простой Animation, то запуск этого Animation на нескольких Widgets должен работать нормально. Ошибка возникает, когда вы используете Sequence (Animations, связанный с '+'). Sequences работает, запуская первый Animation и привязывая внутренний on_complete метод, который запускает следующий Animation в Sequence. Когда вы вызываете start, этот метод on_complete связывается. Но как только первый Animation на первом Widget в Sequence завершается, запускается второй Animation и метод on_complete не связан. Теперь, когда первый Animation на втором Widget завершается, on_complete не вызывается (не был связан после завершения первого Widget), а второй Animation не запускается.

Вот код из Sequence:

def on_anim1_complete(self, instance, widget):
    self.anim1.unbind(on_complete=self.on_anim1_complete)
    self.anim2.start(widget)

В вашем случае, похоже, Animation не начинается со второго Widget, а потому что ваш первый Animation не ' на самом деле ничего не оживляет, вы этого не видите.

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

  • Вы можете создать полную копию Animation во второй раз (copy() или deepcopy() не будет работать), и просто используйте две разные анимации (по одной для каждой Widget).
  • Вы можете сделать свою собственную последовательность, просто используя простой Animations и используйте свой on_complete, чтобы начать следующий Animation. Удобно, что аргументы on_complete включают анимированный виджет, который вам нужен для следующего вызова start().
  • В некоторых ситуациях вы можете анимировать один контейнер (например, Layout). Поскольку это анимация только одного Widget, последовательность должна работать правильно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...