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

2024-04-19 16:07:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Win7 64上使用Kivy1.9.0和Python2.7。
我试图动画一个小部件从当前位置移动到一个特定的位置。在将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对象替换为for,例如,一个按钮对象,动画可以正常工作。
您知道为什么会发生这种情况吗?
谢谢


Tags: 对象代码posself元素屏幕部件with
2条回答

所以,据我所知,当创建一个Widget对象时,Kivy并没有像对Button或其他更复杂的Widget类型那样进行绑定。因此,一个解决方案可以是:
1:就像Yoas所说的那样,用kv语言创建对象。这有一个缺点,那就是它强迫你用kv来完成其余的工作,使之保持一致。在kv中有它们的好处是kivy为你绑定了所有属性。或
2: 自己绑定属性。缺点是您必须盲目地进行绑定,因为您永远不知道在不同情况下使用的属性是什么。

在我的特定案例中,我假设只有pos属性被更改,因为我使用的动画对象只更改了小部件的位置。为了进行绑定,我为小部件创建了一个类,以便更清楚地管理它。
之后:

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

然后我使用了投射对象而不是默认的小部件:

^{pr2}$

现在很好了,谢谢你的提示

当你用python做的时候椭圆.pos没有绑定到射弹.pos在

如果你在kv-lang中也这样做,它会很好的工作

相关问题 更多 >