Виджет Kivy для отображения обновленных значений атрибутов ObjectProperty
Поэтому я пытаюсь обновить свои виджеты всякий раз, когда меняются атрибуты игрока. игрок является объектом игрока. (Значительно) сокращенная версия ниже:
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 - это BoxLayout с ProgressBar, который показывает здоровье игрока.
class GameRoot(BoxLayout):
p= ObjectProperty(player)
def do_something(self):
self.p.stats.health-=5
do_something вызывается при каждом нажатии клавиши ввода (я проверил, что это работает). Вот файл.kv для GameRoot
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 в качестве целочисленных значений или что ListProperties не являются подписчиками.
Я прошу прощения, если я упустил что-то очевидное. Я только недавно начал использовать Kivy.