Виджет 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.

0 ответов

Другие вопросы по тегам