如果项目是以.py而不是kv lang定义的,如何移动Kivy小部件的画布项目?

时间:2016-12-24 22:14:42

标签: python widget kivy kivy-language

我需要能够产生任意的"行星"各种形状,大小和颜色,并在多体模拟中移动它们,添加它们,并在模拟过程中将其移除。

我在kivy小部件画布的实例中添加了许多操作。在尝试找到这个问题的解决方案时,为了进行比较,我还在kivy lang文件中为相应的派生Widget类定义了一个形状(基于Pong教程)。

更改窗口小部件的位置时,只有kv lang文件中定义的形状随窗口小部件移动。在python 3代码中定义的那个不会移动。

在Kivy中移动小部件的画布项以响应小部件位置的变化的正确方法是什么?

以下是一些示例代码,并使用Python 3和Kivy,您将看到白点(在kv lang中定义)远离红点(在小部件的init函数中定义)一旦事件产生了行星"

url = https://github.com/repoAuthorUsername/repo-name.git

谢谢!

1 个答案:

答案 0 :(得分:1)

在发表我自己的问题之后,我想出来了......

更新窗口小部件的pos不会更新该窗口小部件画布中对象的位置。但是您可以单独更新小部件画布中的pos。

我不明白为什么kv lang实现更新了画布中对象的位置,而py实现没有 - 所以也许其他人可以提供更彻底的答案。文档定期表明代码示例的py实现中完成的事情与kv lang相同。但这显然不太正确。所以为什么?谁能解释一下?

然而,这有效......

class Planet(Widget):
    ...
    # store the shapes in the canvas in the object.
    # (could put in a list to iterate over them to update pos)
    ellipse = ObjectProperty(None)
    ...

    def init(self,  pos=(50,50), **kwargs):
        ...
        # save the element we're adding to the canvas
        self.ellipse = Ellipse(pos=self.pos, size=(50,50))
        self.canvas.add(self.ellipse)

    def move(self):
        self.pos = Vector(self.velocity) + self.pos
        self.ellipse.pos = self.pos  # move the canvas element too
        print("Planet now at", self.pos)