我的简化代码(还有一个GameWorld
类,它是根小部件):
class Player(Entity):
# done like this so `ammo` is a readonly property
_ammo = ListProperty()
ammo = AliasProperty(lambda self: self._ammo, bind=['_ammo'])
KV档案:
<GameWorld>:
player: the_player
Player:
id: the_player
center: root.center
Label:
text: str(len(the_player.ammo))
top: root.top
弹药量应在屏幕上自动更新。它没有。这是因为ammo
绑定到_ammo
,但后者永远不会真正改变。它总是保持相同的列表对象,并改变内容。
Kivy解决这个问题的好方法是什么?
编辑:
与此同时,我找到了以下解决方案。我自己触发与ammo
相关联的事件。在弹药可能改变的代码中的任何地方,我都添加了这一行:
self.__class__.ammo.dispatch(self)
我通过ammo
访问self.__class__
因为这会给我ListProperty
对象,而不是列表。然后我在其上调用dispatch(self)
来广播此属性已更改。然后通知并更新GUI。
如果有人有更好的方法,它会很棒:)
答案 0 :(得分:0)
您可以添加另一个AliasProperty
:
ammo_count = AliasProperty(lambda self: len(self._ammo), bind=['_ammo'])
每次_ammo
更改其长度时,都会更新。