首页 > 解决方案 > 如何获取在kivy中动画的对象?

问题描述

问题:


代码:

from kivy.app import App
from kivy.animation import Animation
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen


class ScreenOne(Screen):
    def __init__(self, **kwargs):
        super(ScreenOne, self).__init__(**kwargs)
        self.img1 = Image(source="F:\PyCharm Python Works\Kivy Test\opencityicon (1).png")
        box_layout = BoxLayout()
        self.add_widget(box_layout)
        box_layout.add_widget(self.img1)

    def on_enter(self, *args):
        animation = Animation(d=1, x=560)
        animation.start(self.img1)
        print(animation.animated_properties)


sm = ScreenManager()
sm.add_widget(ScreenOne(name='screen_one'))
sm.current = 'screen_one'


class Test(App):
    def build(self):
        return sm


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

我无法在 Kivy 的文档中找到我的问题的答案!


谢谢你的阅读!!

标签: pythonpython-3.xkivy

解决方案


这是 、 和 类的定制版本AnimationSequence一个Parallel简单的测试用例:

from kivy.animation import Animation, Sequence, Parallel
from kivy.app import App
from kivy.clock import Clock
from kivy.properties import ListProperty
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label


class MySequence(Sequence):
    widgets = ListProperty([])

    def start(self, widget):
        super(MySequence, self).start(widget)
        self.widgets.append(widget)

    def __add__(self, animation):
        return MySequence(self, animation)

    def __and__(self, animation):
        return MyParallel(self, animation)

class MyParallel(Parallel):
    widgets = ListProperty([])

    def start(self, widget):
        super(MyParallel, self).start(widget)
        self.widgets.append(widget)

    def __add__(self, animation):
        return MySequence(self, animation)

    def __and__(self, animation):
        return MyParallel(self, animation)

class MyAnim(Animation):
    widgets = ListProperty([])

    def start(self, widget):
        super(MyAnim, self).start(widget)
        self.widgets.append(widget)

    def __add__(self, animation):
        return MySequence(self, animation)

    def __and__(self, animation):
        return MyParallel(self, animation)


class TestApp(App):
    def animate(self, instance):
        self.animation = MyAnim(pos=(200, 200), d=5)
        self.animation.on_complete = self.completed

        # sequential
        # self.animation += MyAnim(pos=(400, 400), t='out_sine')

        # parallel
        self.animation &= MyAnim(size=(200, 300), d=5)

        Clock.schedule_once(self.another_anim, 1)

        self.animation.start(instance)

    def another_anim(self, dt):
        self.animation.start(self.label)

    def completed(self, widget):
        print('Animation completed - animated Widget:', widget)
        Clock.schedule_once(self.check_anim, 2)

    def check_anim(self, dt):
        print(dt, 'seconds after Animation completed - animated Widgets:', self.animation.widgets)

    def build(self):
        fl = FloatLayout()
        button = Button(size_hint=(None, None), size=(100,50), pos=(0,0), text='click here', on_press=self.animate)
        fl.add_widget(button)
        self.label = Label(text='label', size_hint=(None, None), size=(100, 500), pos=(400, 200))
        fl.add_widget(self.label)
        return fl

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

如果您使用它来代替Animation,那么您可以访问widgets动画列表Widgets


推荐阅读