Kivy - 将标签文本绑定到变量(仅限Python)

Jos*_* B. 0 python label properties kivy

我一直试图让我的标签自动更新自己已经有一段时间了,我已阅读了十几个StackOverflow问题,但无济于事.

我有一个全局对象,其中包含一个整数值,我希望在其中一个窗口小部件类中显示一个标签.

widget类看起来像这样:

class Battle(Widget):

    def __init__(self, **kwargs):
        super(Battle, self).__init__(**kwargs)

        #Enemy Stats
        self.enemyBar = BoxLayout(orientation="horizontal", size=(Window.width, Window.height/8), center_y = Window.height - self.height/2)
        self.enemyBar.add_widget(Label(text=enemy.name))

        #Enemy Health Label
        health_label = Label(text=str(enemy.health))
        self.enemyBar.add_widget(health_label)
        self.add_widget(self.enemyBar)


    def update_health(instance, value):
        health_label.text = str(enemy.health) #<-- Error happens here

    enemy.bind(health=update_health)
Run Code Online (Sandbox Code Playgroud)

enemy.health在程序中更改值时,我希望我的标签也会更改.我不想使用任何kivy语言,因为我更喜欢只有一个主要的python文件.

敌人对象是使用实体类创建的.这是实体代码:

class entity(Widget):
    #entity creation
    health = NumericProperty() 

    def __init__(self, health):
        self.health = health
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,按下一个调用一个改变敌人健康状况的功能的按钮然后我收到一个错误:

全局名称'health_label'未定义

不知何故,当调用update_health函数时,程序不会看到在init中创建的health_label变量.

inc*_*ent 5

您需要使用bind方法,如下所示

health_label = Label(text=enemy.health)
self.enemyBar.add_widget(health_label)
def update_health(instance, value):
    health_label.text = str(enemy.health)
enemy.bind(health=update_health)
Run Code Online (Sandbox Code Playgroud)

这只是我头脑中的一个基本示例,它可以根据程序的结构做得更整洁.如果enemy.health是一个字符串,你可以这样做enemy.bind(health=health_label.setter('text')).

为此,health属性必须是kivy属性:

class Enemy(Something):
    health = StringProperty('')
Run Code Online (Sandbox Code Playgroud)

在你的代码中,似乎敌人是一个全局对象.很可能有更好的方法.另外,我建议使用kv语言 - 将代码放在一个文件中并没有什么特别的价值(事实上,一旦它变得非常重要,它通常被认为是不好的做法),并且kv使得很多事情变得更容易不适合某些任务.