更改根对象时更新Kivy小部件

时间:2019-08-30 00:13:23

标签: python python-3.x kivy kivy-language

我有一个对象形式的数据结构,该对象是我使用Kivy图形表示的。

如果可能的话,我想编写它,以便在更改根对象时,Kivy中的小部件可以反映出更改。到目前为止,我注意到的是,在最初创建窗口小部件时,我可以使用KV语言调用该对象,并且可以让这些窗口小部件修改根对象,但是 应该“绑定”到根对象变量的窗口小部件不会更新。

我正在寻找一种“绑定”它们的方法,这样就不必编写每次进行更改时都会遍历我的数据对象的“刷新/重新加载”功能。

下面是示例代码,显示了到目前为止如何设置我的代码。

根据我在kivy api文档中所了解的内容,使用ObjectProperty(object,rebind = True)应该可以完成我想做的事情。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty


class DataObject():
    def __init__(self, name="foo", data="bar"):
        self.name = name
        self.data = data


class MainWindow(Screen):
    pass


class WindowManager(ScreenManager):
    data = DataObject()
    data_obj = ObjectProperty(data, rebind=True)


kv = Builder.load_file("my.kv")


class MyMainApp(App):
    def build(self):
        return kv


if __name__ == '__main__':
    MyMainApp().run()
WindowManager:
    MainWindow:


<MainWindow>:
    name: "Main"

    GridLayout:
        cols: 1

        GridLayout:
            cols: 2

            Label:
                text: root.manager.data_obj.name

        Button:
            text: "Change Name"
            on_release:
                root.manager.data_obj.name = "Bar"
                print(root.manager.data_obj.name)

按下“更改名称”按钮,将对象data_obj.name从“ foo”更改为“ bar”,并将其打印到控制台以确认更改

我希望“标签”文本也更改为“栏”

1 个答案:

答案 0 :(得分:0)

rebind适用于Properties,不适用于类属性,因此您的逻辑将失败。一种可能的解决方案是DataObject是EventDispatcher,名称是data,ObjectProperty

from kivy.event import EventDispatcher

class DataObject(EventDispatcher):
    name  = ObjectProperty("foo")
    data = ObjectProperty("bar")