我在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对象,动画正常工作。
你知道为什么会这样吗?
谢谢
答案 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中也这样做,那就可以了。