如何绑定ListProperty的长度?

时间:2016-04-28 23:47:22

标签: python user-interface events kivy

我的简化代码(还有一个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。

如果有人有更好的方法,它会很棒:)

1 个答案:

答案 0 :(得分:0)

您可以添加另一个AliasProperty

ammo_count = AliasProperty(lambda self: len(self._ammo), bind=['_ammo'])

每次_ammo更改其长度时,都会更新。