Kivy小部件显示ObjectProperty属性的更新值

时间:2016-05-20 17:12:32

标签: python-3.x kivy object-property

因此,每当玩家的属性发生变化时,我都会尝试更新我的小部件。播放器是播放器对象。 (很多)缩短版本如下:

class Stats(Object):
    def __init__(self, health, max_health):
        self.health=health
        self.max_health=max_health
class Player(Object):
    def __init__(self, stats):
        self.stats=stats

player= Player(Stats(50,100))

我的kivy root类是一个BoxLayout,它有一个显示播放器运行状况的ProgressBar。

class GameRoot(BoxLayout):
    p= ObjectProperty(player)
    def do_something(self):
        self.p.stats.health-=5

每次按下回车键都会调用do_something(我已经检查过这是否有效)。这是GameRoot的.kv文件

GameRoot:
    ProgressBar:
        min:0
        max:root.p.stats.max_health
        value:root.p.stats.health

一切正常,但当玩家的健康状况(或任何其他属性)被改变时,小部件不会更新。

GameRoot的以下更改使其更新:

class GameRoot(BoxLayout):
    phealth= ObjectProperty(player.stats.health)
    p= ObjectProperty(player)
    def do_something(self):
        self.phealth-=5
GameRoot:
    ProgressBar:
        min:0
        max:root.p.stats.max_health
        value:root.phealth

但这不是一个好的选择,因为Player和Stats都有许多实例变量,我需要在它们发生变化时进行更新。

我将不胜感激任何帮助。我环顾四周,但没有找到任何解决方案。

修改

当我将所有内容更改为属性时,当我尝试在函数中使用属性时出现错误。

class Stats(EventDispatcher):
    levels = ListProperty(levels)
    health = NumericProperty()
    xp = NumericProperty()
    level = NumericProperty()
    max_health = NumericProperty()
    def __init__(self, **kwargs):
        super().__init__(Stats, self).__init__(**kwargs)

    def set_level(self):
        for l in range(100):
            if self.xp < self.levels[l]:
                self.level= l-1
                break
s= Stats
s.health=10
s.xp=500
s.set_level()

我收到以下错误: TypeError:set_level()缺少1个必需的位置参数:'self'

在代码的其他区域,我得到错误,说我不能将NumericProperties用作int或者ListProperties不可订阅。

如果我遗漏了一些明显的东西,我道歉。我最近才开始使用Kivy。

0 个答案:

没有答案