Sairam Mangeshkar
Sairam Mangeshkar

Reputation: 371

How to get object which is animated in kivy?

Question:


Code:

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()

I am not able find a answer for my question in the docs of Kivy!


Thank you for reading!!

Upvotes: 2

Views: 239

Answers (1)

John Anderson
John Anderson

Reputation: 39012

Here is a customized version of the Animation, Sequence, and Parallel classes and a simple test case:

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()

If you use this in place of Animation, then you can access the widgets list of animated Widgets.

Upvotes: 3

Related Questions