首页 > 解决方案 > 如何在 Kivy 中一次启动多个动画?

问题描述

目标:


预期结果:


实际结果:


参考代码:

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)


感谢您。

标签: pythonkivy

解决方案


我相信你在 kivy 中遇到了一个错误Animation。如果您只是使用简单的Animation,那么Animation在多个上启动它Widgets应该可以正常工作。当您使用Sequence(Animations与 '+' 连接) 时会发生该错误。Sequences通过运行第一个Animation并绑定一个内部on_complete方法来工作,该方法AnimationSequence. 当您调用 时start,该on_complete方法被绑定。但是一旦第一个中Animation的第一个完成,第二个就会启动并且该方法是未绑定的。现在,当第二个的第一个完成时,未调用(在第一个之后未绑定WidgetSequenceAnimationon_completeAnimationWidgeton_completeWidget完成),第二个Animation没有开始。

这是来自的代码Sequence

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

在您的情况下,看起来 theAnimation不是从 second 开始的Widget,但是因为您的 firstAnimation实际上并没有为任何东西设置动画,所以您看不到它。

不幸的是,没有很多替代方法可以避免这个问题。

  • 您可以第二次构建整个副本Animationcopy()deepcopy()不起作用),并且只使用两个不同的动画(每个动画一个Widget)。
  • 您可以使用 simple 进行自己的排序,Animations然后使用您自己on_complete的开始下一个Animation. 方便的是,参数包括下一次调用on_complete所需的动画小部件。start()
  • 在某些情况下,您可以为单个容器(如 a Layout)设置动画。由于这只是对单个 进行动画Widget处理,因此排序应该可以正常工作。

推荐阅读