Kivy ObjectProperty更新标签文本

发布于 2021-01-29 15:21:09

我正在创建一个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正在正确更新。但是,所有标签都没有更新。有人可以弄清楚该怎么做吗?

关注者
0
被浏览
40
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    但是,所有标签都没有更新。有人可以弄清楚该怎么做吗?

    您引用需要的属性是Kivy性质,但abc您引用都只是蟒蛇属性,以便Kivy有没有办法约束他们的变化。

    要使用属性,您需要从中继承对象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语言创建绑定(我通常会那样做),也可以查看Kivy的AliasProperty以获取更类似于您的原始定义的信息。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看