問題描述
我已經嘗試讓我的標簽自動更新很長一段時間了,我已經閱讀了十幾個 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)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!