【问题标题】:Kivy Animation Class to Animate Kivy ImagesKivy 动画类为 Kivy 图像设置动画
【发布时间】:2017-07-06 17:57:00
【问题描述】:

Python 3.4 Kivy 1.10.0

我正在尝试使用 Kivy Animation 类为我的 Image 类设置动画。这是因为我想分别修改每张图像的 anim_delay 和 position 值。

我想修改图像类的“源”属性。尽管它可以识别“源”属性,但它会尝试将文件名字符串文件相乘。

如何修改图片文件名?

工作示例:

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

错误日志:

[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'

查看 Kivy Code 中的 animation.py,我发现从上面返回错误的值是:

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

这是否意味着这不是 Kivy 代码固有的动画?或者,我该如何解决这个问题,以便动画能够正确循环播放?

【问题讨论】:

    标签: python animation kivy


    【解决方案1】:

    发生错误是因为 动画 无法从 str 对象过渡到 str 对象 "image0.png" -> "image1.png" !?

    解决此问题的一种方法是使用 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)
    

    另一种选择是在图像上具有 image_num 属性并绑定它,以便相应地更改图像...

    例如在KV文件中:

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

    在 .py 文件中:

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

    【讨论】:

    • 谢谢您这确实有效,并已接受它作为解决方案。但是,我将无法使用它,因为使用它时似乎有半秒的延迟。
    • 我看不出有什么大延迟的原因,也许你的图片很大?
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多