【问题标题】:Updating Kivy Widgets when Root Object Changes根对象更改时更新 Kivy 小部件
【发布时间】:2019-08-30 00:13:23
【问题描述】:

我有一个对象形式的数据结构,我使用 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”并将其打印到控制台以确认它已更改

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

【问题讨论】:

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


    【解决方案1】:

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

    from kivy.event import EventDispatcher
    
    class DataObject(EventDispatcher):
        name  = ObjectProperty("foo")
        data = ObjectProperty("bar")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2018-09-23
      • 2013-05-05
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多