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