在 Kivy 中使用 Id 的参考小部件(KV 语言)

Reference widget using id in Kivy (kv language)

我有以下KV语言(简化示例): 我的问题是最后一行 (on_release).

#:import Factory kivy.factory.Factory

<MyCustomWidgets>:
    
    ListView:
        id: my_listview
    
    
<MainScreen>:
    
    Button:
        text: "Choose File"
        on_release: Factory.FileChooserDialog().open()
    
    MyCustomWidgets:
            
    
<FileChooserDialog@ModalView>:
    
    FileChooserIconView:
        id: filechooser

    Button:
        text: "OK"
        on_release: app.root.add_to_listview("Sample Text", app.root.ids.my_listview)

在Python中,我有:

class MainScreen(BoxLayout):
    def add_to_listview(self, thelistview):
        # For testing purposes.
        print(type(thelistview))

在 KV 中,在最后一行,我正在尝试 运行 一个 python 方法,该方法将一个字符串添加到 ID 为 [=14= 的 ListView ].

我收到这个错误:

AttributeError: 'super' object has no attribute '__getattr__'

使用 Kivy ObjectPropertymy_listview = ObjectProperty(None) 并将其连接 (my_listview: my_listview) 到 kv 文件中定义的 id: my_listview。详情请参考示例和输出。

例子

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty


class MyCustomWidgets(BoxLayout):
    my_listview = ObjectProperty(None)


class MainScreen(BoxLayout):

    def add_to_listview(self, *args, thelistview):
        # For testing purpose
        print(self)
        print(args[0])
        print(thelistview)


class TestApp(App):
    title = "Reference widget using id in Kivy (kv language)"

    def build(self):
        return MainScreen()


if __name__ == "__main__":
    TestApp().run()

test.kv

#:kivy 1.10.0
#:import Factory kivy.factory.Factory


<MyCustomWidgets>:
    my_listview: my_listview
    ListView:
        id: my_listview


<MainScreen>:
    orientation: "vertical"

    Button:
        text: "Choose File"
        on_release: Factory.FileChooserDialog().open()

    MyCustomWidgets:
        id: my_cw


<FileChooserDialog@ModalView>:

    id: filechooser

    Button:
        text: "OK"
        on_release:
            app.root.add_to_listview("Sample Text", thelistview=app.root.ids.my_cw.my_listview)

输出