【问题标题】:Kivy - Bind Label Text To Variable (Python Only)Kivy - 将标签文本绑定到变量(仅限 Python)
【发布时间】:2015-04-18 02:50:13
【问题描述】:

我已经尝试让我的标签自动更新很长一段时间了,我已经阅读了十几个 StackOverflow 问题,但无济于事。

我有一个全局对象,其中包含一个整数值,我希望在其中一个小部件类中显示该值并带有标签。

小部件类如下所示:

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)

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

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

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

    def __init__(self, health):
        self.health = health

当我运行代码时,我按下一个按钮,该按钮调用一个改变敌人生命值的函数,然后我得到一个错误:

未定义全局名称“health_label”

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

【问题讨论】:

  • 我通过将 health_label 变量设为全局变量来解决问题,现在这是我获得所需结果的唯一方法。

标签: python properties label kivy


【解决方案1】:

你需要使用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)

这只是我脑海中的一个基本示例,它可以根据程序的结构变得更简洁。如果enemy.health 是一个字符串,你可以直接使用enemy.bind(health=health_label.setter('text'))

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

class Enemy(Something):
    health = StringProperty('')

在您的代码中,敌人似乎是一个全局对象。很可能有更好的方法来做到这一点。另外,我建议使用 kv 语言 - 将代码放在一个文件中并没有任何特殊价值(事实上,一旦它变得不平凡,它通常被认为是不好的做法),并且 kv 使很多事情变得更容易,而 python 只是'不适合某些任务。

【讨论】:

  • 感谢您的回复,但我仍然无法实现此代码。我更新了我的问题,为您提供有关我如何创建敌人对象和声明健康变量的更多信息。谢谢!
  • 好的,我将 init 中的 health_label 设为全局变量,它可以工作。我确信有更好的方法来定义变量,但现在我有一个解决方案。感谢您的帮助!
【解决方案2】:

要补充说的内容,您可以为您制作的元素添加各种类型的绑定。请记住,对于生成动作的元素(例如按钮)有不同的方法。这是我用来创建按钮以搜索附近蓝牙设备的示例(但您唯一需要考虑的是我使用的方法):

    size = dp(50)
    b = Button(text="Start Research", size_hint=(1, None), size=(1,size))
    self.bind(searching_devices=b.setter("disabled"))
    b.bind(on_press=self.start_searching)
    self.add_widget(b)

这里 searching_devices 是一个 BooleanProperty,start_searching() 是一个函数。 正如你所看到的,disabled 属性,它为按钮“提供”信息,它与 setter 绑定,正如文本元素所讨论的那样。对于使用 on_press 属性等组件生成的操作,您可以直接绑定它而无需设置器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2011-03-09
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多