Kivy中Widget对象的动画效果不如预期

4

我正在使用Python 2.7和Kivy 1.9.0在Win7 64位系统上进行开发。
我尝试动画化一个Widget,使其从当前位置移动到指定位置。在将Widget添加到屏幕后,我启动了动画效果,但是没有任何变化。我希望这个Widget可以根据动画的位置移动。以下是代码:

projectile = Widget(pos=(self._posX + self._projectile_x, self._posY + self._projectile_y))
with projectile.canvas:
    Ellipse(pos=projectile.pos, size=(10,10))

self.add_widget(projectile)

anim = Animation(x=100, y=100)
anim.start(projectile)

小的椭圆形部件不会移动,它只会出现在指定的坐标上。如果我将Widget对象替换为例如Button对象,则动画可以正常工作。
您有任何想法为什么会发生这种情况吗?
谢谢

2个回答

2
所以,从我所理解的来看,当动态创建小部件对象(代码方式)时,Kivy不会像对按钮或其他更复杂类型的小部件进行绑定。因此,解决方案可以是:
1: 正如Yoas所说要在kv语言中创建对象。这样做的缺点是,它迫使您始终使用kv来保持一致。将它们放在kv中的好处是kivy会为您绑定所有属性。 或者
2: 自己为属性绑定。缺点是您必须盲目地进行绑定,因为您永远不知道在不同情况下使用哪些属性。

在我的特定情况下,我假设仅更改pos属性,因为我使用了一个只更改小部件位置的Animation对象。为了进行绑定,我创建了一个小部件类,以便更清晰地管理它。
class Projectile(Widget):

def __init__(self, pos, size):
    super(Projectile, self).__init__(pos=pos, size=size)
    with self.canvas:
        self.ellipse = Ellipse(pos=pos, size=size)

    self.bind(pos = self.updatePosition)

def updatePosition(self, *args):
    self.ellipse.pos = self.pos

然后我使用了Projectile对象代替我的默认Widget:

proj = Projectile(pos=(self._posX + self._projectile_x, self._posY + self._projectile_y), size = (10, 10))

self.add_widget(proj)

animation = Animation(pos=(100, 100))
animation.start(proj)

现在这个没问题了,感谢 Yoav 的提示


1
当您在Python中执行时,椭圆形.pos未绑定到projectile.pos。
如果您在kv语言中执行相同的操作,它将正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接