对于Kivy中的Widget对象,动画不能正常工作

时间:2016-01-19 14:26:09

标签: python kivy

我在Win7 64上使用Kivy 1.9.0和Python 2.7 我试图动画一个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 个答案:

答案 0 :(得分:2)

因此,根据我的理解,在以动态方式(代码方式)创建Widget对象时,Kivy不会像对Button或其他Widget更复杂的类型那样执行相同的绑定。因此,一个解决方案可以是: 1:,因为Yoas说使用kv语言创建对象。这有一个缺点,它会以某种方式强迫你做kv中的其余部分是一致的。将它们放在kv中的好处是kivy能为你绑定所有属性。 OR
2:自己对属性进行绑定。缺点是您必须盲目地进行绑定,因为您永远不知道在不同情况下使用的属性是什么。

在我的特定情况下,我假设只有pos属性被更改,因为我使用了动画只更改Widget位置的对象。为了进行绑定,我为Widget创建了一个类,这样我就可以更清楚地管理它了 AFTER:

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 :(得分:1)

当你在python中执行它时,Ellipse.pos没有绑定到projectile.pos

如果你在kv lang中也这样做,那就可以了。