gpt4 book ai didi

python - Kivy ObjectProperty 更新标签文本

转载 作者:太空狗 更新时间:2023-10-29 20:20:13 25 4
gpt4 key购买 nike

我正在创建一个 kivy 用户界面来显示由我编写为标准 python 对象的数据模型生成的值。本质上,我希望用户能够按下一个按钮,这将更改底层数据模型,并且此更改的结果将自动更新和显示。据我了解,这可以使用 kivy 属性(在本例中为 ObjectProperty)来实现。

下面是一些示例代码:

import kivy
kivy.require('1.7.0')

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.lang import Builder

Builder.load_string("""
<RootWidget>:
cols: 2
Label:
text: "Attribute a:"
Label:
text: root.data_model.a
Label:
text: "Attribute b:"
Label:
text: root.data_model.b
Label:
text: "Attribute c:"
Label:
text: root.data_model.c
Button:
text: "Make data_model.a longer"
on_press: root.button_press()
Button:
text: "Make data_model.b shorter"
on_press: root.button_press2()
""")


class DataModel(object):
def __init__(self):
self.a = 'This is a'
self.b ='This is b'

@property
def c(self):
return self.a + ' and ' + self.b

class RootWidget(GridLayout):
data_model = ObjectProperty(DataModel())

def button_press(self, *args):
self.data_model.a = 'This is a and it is really long now'
print self.data_model.c

def button_press2(self, *args):
self.data_model.b = 'B'
print self.data_model.c

class TestApp(App):
def build(self):
return RootWidget()

app = TestApp()
app.run()

期望的结果是当用户按下任一按钮时,标签将自动更新以显示新属性。从打印语句可以看出,data_model 正在正确更新。但是,没有任何标签正在更新。有人可以阐明如何做到这一点吗?

最佳答案

However, none of the labels are updating. Can someone clarify how to do this?

你引用的属性需要是Kivy属性,但是你引用的abc都是python属性所以Kivy无法绑定(bind)到他们的更改。

要使用属性,您需要对象从 EventDispatcher 继承(Kivy 小部件会自动执行此操作,这就是它们的属性起作用的原因)。

from kivy.event import EventDispatcher

class DataModel(EventDispatcher):
a = StringProperty('')
b = StringProperty('')
c = StringProperty('')

def __init__(self, *args, **kwargs):
super(DataModel, self).__init__(*args, **kwargs)
self.a = 'This is a'
self.b ='This is b'
self.bind(a=self.set_c)
self.bind(b=self.set_c)

def set_c(self, instance, value):
self.c = self.a + ' and ' + self.b

请注意,这不是获得您想要的 c 行为的唯一方法(甚至不一定是最佳方法)。您可以使用 kv 语言创建绑定(bind)(我通常这样做),或者您可以查看 Kivy 的 AliasProperty 以获得更像您的原始定义的内容。

当然你也可以在声明属性的时候设置a和b的值。

关于python - Kivy ObjectProperty 更新标签文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21617843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com