3 votes

Classe d'animation Kivy pour animer des images Kivy

Python 3.4 Kivy 1.10.0

J'essaie d'utiliser la classe Kivy Animation pour animer ma classe Image. En effet, je veux modifier les valeurs anim_delay et position pour chaque image séparément.

Je veux modifier la propriété "source" d'une classe d'image. Bien qu'il reconnaisse la propriété 'source', il tente de multiplier la chaîne de caractères du nom de fichier.

Comment puis-je modifier les noms des fichiers images ?

Exemple de travail :

from kivy.app import App
from kivy.animation import Animation
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.image import Image

class Test(App):
    def __init__(self, **kwargs):
        super(Test, self).__init__(**kwargs)

        self.content = BoxLayout()
        self.content.orientation = 'vertical' 
        self.anim_image = Image(source = 'image1.png')
        self.anim_button = Button(on_press=self.animate_image)
        self.content.add_widget(self.anim_image)
        self.content.add_widget(self.anim_button)

    def build(self):
        return self.content

    def animate_image(self, *args, **kwargs):
        image_animate = Animation()
        for i in range(4):
            image_animate += Animation(x = (i + 10), source = 'image' + str(i) + '.png', duration=(0.10 * i))
        image_animate.start(self.anim_image)

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

Journal d'erreurs :

[INFO   ] [Base        ] Leaving application in progress...
 Traceback (most recent call last):
   File "C:\Python34x86\projects\rogue_like_app\repeatable issues\animation_image_source.py", line 31, in <module>
     Test().run()
   File "C:\Python34x86\lib\site-packages\kivy\app.py", line 828, in run
     runTouchApp()
   File "C:\Python34x86\lib\site-packages\kivy\base.py", line 504, in runTouchApp
     EventLoop.window.mainloop()
   File "C:\Python34x86\lib\site-packages\kivy\core\window\window_sdl2.py", line 663, in mainloop
     self._mainloop()
   File "C:\Python34x86\lib\site-packages\kivy\core\window\window_sdl2.py", line 405, in _mainloop
     EventLoop.idle()
   File "C:\Python34x86\lib\site-packages\kivy\base.py", line 339, in idle
     Clock.tick()
   File "C:\Python34x86\lib\site-packages\kivy\clock.py", line 581, in tick
     self._process_events()
   File "kivy\_clock.pyx", line 367, in kivy._clock.CyClockBase._process_events (kivy\_clock.c:7700)
   File "kivy\_clock.pyx", line 397, in kivy._clock.CyClockBase._process_events (kivy\_clock.c:7577)
   File "kivy\_clock.pyx", line 395, in kivy._clock.CyClockBase._process_events (kivy\_clock.c:7498)
   File "kivy\_clock.pyx", line 167, in kivy._clock.ClockEvent.tick (kivy\_clock.c:3490)
   File "C:\Python34x86\lib\site-packages\kivy\animation.py", line 345, in _update
     value = calculate(a, b, t)
   File "C:\Python34x86\lib\site-packages\kivy\animation.py", line 376, in _calculate
     return (a * (1. - t)) + (b * t)
 TypeError: can't multiply sequence by non-int of type 'float'

En regardant dans animation.py de Kivy Code, je vois que les valeurs qui renvoient une erreur sont les suivantes :

a = image2.png
b = image1.png
t = 0.0

Cela signifie-t-il que faire une animation comme je l'avais prévu n'est pas inhérent au code Kivy ? Ou, comment puis-je résoudre ce problème pour que l'animation tourne correctement en boucle ?

5voto

Yoav Glazner Points 5729

L'erreur se produit parce que le Animation ne peut pas faire une transition d'un str à un objet str objet "image0.png" -> "image1.png" ! ?

Une façon de contourner ce problème est d'utiliser la fonction Rappel de la fonction on_complete

def animate_image(self, *args, **kwargs):
    image_animate = Animation()

    def f(i, w):
        w.source = 'image%d.jpg' % i

    for i in range(4):

        a = Animation(x = (i + 10), duration=(0.10 * i),
                      )
        a.on_complete = functools.partial(f, i)

        image_animate += a

    image_animate.start(self.anim_image)

Une autre option est d'avoir un numéro d'image sur l'image et la lier pour qu'elle change l'image en conséquence ...

par exemple dans le fichier KV :

<MyImage>:
    image_num: 0
    source: "image%d.png" % int(self.image_num)

et dans le fichier .py :

image_animate += Animation(x = (i + 10), image_num=i, duration=(0.10 * i))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X