我需要能够产生任意的"行星"各种形状,大小和颜色,并在多体模拟中移动它们,添加它们,并在模拟过程中将其移除。
我在kivy小部件画布的实例中添加了许多操作。在尝试找到这个问题的解决方案时,为了进行比较,我还在kivy lang文件中为相应的派生Widget类定义了一个形状(基于Pong教程)。
更改窗口小部件的位置时,只有kv lang文件中定义的形状随窗口小部件移动。在python 3代码中定义的那个不会移动。
在Kivy中移动小部件的画布项以响应小部件位置的变化的正确方法是什么?
以下是一些示例代码,并使用Python 3和Kivy,您将看到白点(在kv lang中定义)远离红点(在小部件的init函数中定义)一旦事件产生了行星"
url = https://github.com/repoAuthorUsername/repo-name.git
谢谢!
答案 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)