Kivy - 将标签文本绑定到变量(仅限 Python)
Kivy - Bind Label Text To Variable (Python Only)
我已经尝试让我的标签自动更新自己很长一段时间了,我已经阅读了十几个 Whosebug 问题,但无济于事。
我有一个全局对象,它包含一个整数值,我想在我的一个小部件 classes 中用标签显示它。
小部件 class 如下所示:
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 创建的。这是实体代码:
class entity(Widget):
#entity creation
health = NumericProperty()
def __init__(self, health):
self.health = health
当我 运行 代码时,我按下一个按钮调用一个函数来改变敌人的生命值,然后我得到一个错误:
全局名称'health_label'未定义
不知何故,当调用 update_health 函数时,程序看不到在 init 中创建的 health_label 变量。
需要使用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'))
.
为此,健康属性必须是 kivy 属性:
class Enemy(Something):
health = StringProperty('')
在您的代码中,enemy 似乎是一个全局对象。很可能有更好的方法来做到这一点。另外,我建议使用 kv 语言——将代码放在一个文件中并没有什么特别的价值(事实上,一旦它变得重要,它通常被认为是不好的做法),并且 kv 使很多事情变得更容易 python 只是不适合某些任务。
补充说,您可以为您制作的元素添加各种类型的绑定。请记住,对于生成操作的元素(例如按钮),有不同的方法来执行此操作。这是我用来创建搜索附近蓝牙设备的按钮的示例(但您唯一需要考虑的是我使用的方法):
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是一个布尔属性,start_searching()是一个函数。
可以看到,disabled属性,其中'gives'一个信息给按钮绑定了一个setter,就像文本元素inclement一样讨论过。对于使用on_press属性这样的组件生成的动作,直接绑定即可,不用setter.
我已经尝试让我的标签自动更新自己很长一段时间了,我已经阅读了十几个 Whosebug 问题,但无济于事。
我有一个全局对象,它包含一个整数值,我想在我的一个小部件 classes 中用标签显示它。
小部件 class 如下所示:
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 创建的。这是实体代码:
class entity(Widget):
#entity creation
health = NumericProperty()
def __init__(self, health):
self.health = health
当我 运行 代码时,我按下一个按钮调用一个函数来改变敌人的生命值,然后我得到一个错误:
全局名称'health_label'未定义
不知何故,当调用 update_health 函数时,程序看不到在 init 中创建的 health_label 变量。
需要使用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'))
.
为此,健康属性必须是 kivy 属性:
class Enemy(Something):
health = StringProperty('')
在您的代码中,enemy 似乎是一个全局对象。很可能有更好的方法来做到这一点。另外,我建议使用 kv 语言——将代码放在一个文件中并没有什么特别的价值(事实上,一旦它变得重要,它通常被认为是不好的做法),并且 kv 使很多事情变得更容易 python 只是不适合某些任务。
补充说,您可以为您制作的元素添加各种类型的绑定。请记住,对于生成操作的元素(例如按钮),有不同的方法来执行此操作。这是我用来创建搜索附近蓝牙设备的按钮的示例(但您唯一需要考虑的是我使用的方法):
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是一个布尔属性,start_searching()是一个函数。 可以看到,disabled属性,其中'gives'一个信息给按钮绑定了一个setter,就像文本元素inclement一样讨论过。对于使用on_press属性这样的组件生成的动作,直接绑定即可,不用setter.