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

本文介绍了Kivy - 将标签文本绑定到变量(仅限 Python)的处理方法,对大家解决问题具有一定的参考价值

问题描述

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

I have been trying to get my labels to auto-update themselves for quite a while now and I have read over a dozen StackOverflow questions but to no avail.

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

I have an global object that contains an integer value that I want to be displayed with a label inside of one of my widget classes.

小部件类如下所示:

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 文件.

When the value of enemy.health is changed in the program, I want my label to change as well. I do not want to use any of the kivy language because I prefer having just one main python file.

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

The enemy object is created with an entity class. Here is the entity code:

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

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

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

When I run the code I press a button that calls a function that changes the enemy health and then I get an error:

未定义全局名称health_label"

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

Somehow, when the update_health function is called, the program doesn't see the health_label variable that was created in the init.

推荐答案

需要使用bind方法,类似如下

You need to use the bind method, something like the following

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')).

This is just a basic example off the top of my head, it can be made neater depending on the structure of your program. If enemy.health is a string, you can just do enemy.bind(health=health_label.setter('text')).

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

For this to work, the health attribute must be a kivy property:

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

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

In your code it seems that enemy is a global object. There is quite likely a better way to do that. Also, I recommend using kv language - there is not really any special value in putting your code in one file (indeed, it's commonly considered bad practice once it gets non-trivial), and kv makes a lot of things easier where python just isn't suited to certain tasks.

这篇关于Kivy - 将标签文本绑定到变量(仅限 Python)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2

WordPress使用python会话上载文件

我需要上传图像到wordpress编程,理想情况下没有安装额外的插件。不过,我对涉及插件的最佳实践持开放态度。到目前为止,我已经能够使用会话登录和移动站点,但是当我尝试将文件上载到媒体时-新建.php或异步-上传.php我收到以下错误消息The file is a test text file with a single line (also the upload limit on the site is 1GB) so it\"s not the common file size limit. This ...

日期:2021-08-21 05:00:01 浏览:783

压缩序列化的Python数据最节省空间的方法是什么?

本文介绍了压缩序列化的Python数据最节省空间的方法是什么?的处理方法,对大家解决问题具有一定的参考价值 问题描述 发件人the Python documentation:默认情况下,Pickle数据格式使用相对紧凑的二进制表示。如果您需要最佳大小特性,您可以高效地压缩酸洗数据。我将在一个运行了几个小时的过程结束时序列化...

日期:2022-06-23 08:50:34 浏览:750

在Python中,有没有一种方法可以将一个单词分割成等分?

本文介绍了在Python中,有没有一种方法可以将一个单词分割成等分?的处理方法,对大家解决问题具有一定的参考价值 问题描述 几周前我问了这个问题,得到了答案this is the original post但我需要将输出分成相等的部分,无论字符串的长度如何,所以在我发布的第一个帖子中,我得到了这个答案,它很好地工作了,这要...

日期:2022-06-24 06:52:06 浏览:472

如何在 Google AppEngine Python37 中获取凭据

本文介绍了如何在 Google AppEngine Python37 中获取凭据的处理方法,对大家解决问题具有一定的参考价值 问题描述 我在 AppEngine Python3.7 标准中启动了新应用.I started new app in AppEngine Python3.7 stadard.我正在尝试使用以下代码段...

日期:2022-06-24 09:00:27 浏览:548

为什么 python 字符串和元组是不可变的?

本文介绍了为什么 python 字符串和元组是不可变的?的处理方法,对大家解决问题具有一定的参考价值 问题描述 我不确定为什么字符串和元组是不可变的;使它们不可变的优点和缺点是什么?I am not sure why strings and tuples were made to be immutable; what ar...

日期:2022-06-24 09:00:30 浏览:882

使用 Python 解析 Gmail 并将所有早于日期的内容标记为“已读"

本文介绍了使用 Python 解析 Gmail 并将所有早于日期的内容标记为“已读"的处理方法,对大家解决问题具有一定的参考价值 问题描述 长话短说,我创建了一个新的 gmail 帐户,并将其他几个帐户关联到该帐户(每个帐户都有 1000 条消息),我正在导入这些帐户.所有导入的邮件都以未读的形式到达,但我需要它们显示为已...

日期:2022-06-24 10:00:29 浏览:808

了解python线程错误

本文介绍了了解python线程错误的处理方法,对大家解决问题具有一定的参考价值 问题描述 阅读http://bugs.python.org/msg160297,我可以看到Stephen White编写的一个简单脚本,它演示了该异常是如何导致python线程出错的Exception AttributeError: Attri...

日期:2022-06-24 21:00:28 浏览:944

从python调用url时获取“错误"的页面源

本文介绍了从python调用url时获取“错误"的页面源的处理方法,对大家解决问题具有一定的参考价值 问题描述 尝试从网站检索页面源时,得到的文本与通过 Web 浏览器查看相同页面源时完全不同(且更短).Trying to retrieve the page source from a website, I get a c...

日期:2022-06-25 01:00:31 浏览:594

基于 Python 类的装饰器,带有可以装饰方法或函数的参数

本文介绍了基于 Python 类的装饰器,带有可以装饰方法或函数的参数的处理方法,对大家解决问题具有一定的参考价值 问题描述 我见过很多 Python 装饰器的例子:I've seen many examples of Python decorators that are:函数样式装饰器(包装函数)类样式装饰器(实现 __...

日期:2022-06-25 04:00:31 浏览:924

用python解析outlook .msg文件

本文介绍了用python解析outlook .msg文件的处理方法,对大家解决问题具有一定的参考价值 问题描述 环顾四周,没有找到满意的答案.有谁知道如何使用 Python 解析 Outlook 中的 .msg 文件?Looked around and couldn't find a satisfactory answer...

日期:2022-06-25 06:00:30 浏览:639