Kivy如何从字典创建小部件

3

我是kivy库的新手,这是一个用于Python的GUI库。我发现了一个名为kivy-md的附加库,其中包含非常好看的UI元素。目前,我想根据一个字典变量创建多个MDTextField小部件,例如:

# text_fields.py
text_fields = {
    "text_field1": {
        "key": 0,
        "self": "text_field1",
        "hint_text": "Textfield 1",
        "helper_text": "This is textfield 1",
    },

    "text_field2": {
        "key": 1,
        "self": "text_field2",
        "hint_text": "Textfield 2",
        "helper_text": "This is textfield 2",
    }
}

从这个变量中,我想在kv文件中创建类似于小部件的东西

GridLayout:
    MDTextField:
        id: text_field1
        hint_text: text_fields["text_field1"]["hint_text"]
        helper_text: text_fields["text_field1"]["helper_text"]
        helper_text_mode: "on_focus"
        on_text_validate: app.on_text_validate(text_fields["text_field1"]["self"])
    MDTextField:
        id: text_field2
        hint_text: text_fields["text_field2"]["hint_text"]
        helper_text: text_fields["text_field2"]["helper_text"]
        helper_text_mode: "on_focus"
        on_text_validate: app.on_text_validate(text_fields["text_field2"]["self"])

我看到这个问题有两个挑战,我无法解决。第一个是如何从字典字符串中解析id值,第二个问题是我不知道如何在kv文件中循环遍历kivy小部件。
有没有方法可以实现我想要的?

@eyllanesc:我也不知道如何在代码中生成它。但我更喜欢将其放在kv文件中,以便布局和逻辑分离。 - New2Coding
嗯...我不太明白你的评论。目前,我在我的main.py文件中的所有代码只是做某些事情,但它没有生成布局和显示的内容。 - New2Coding
1个回答

2
请注意,KivyMD MDTextField 中没有属性 self 和 key。在示例中,我们使用嵌套的 for 循环来访问字典 text_fields.py。

示例

main.py

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivymd.textfields import MDTextField
from kivymd.theming import ThemeManager
from text_fields import text_fields
from functools import partial


class RootWidget(GridLayout):

    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)
        self.cols = 1
        app = App.get_running_app()
        for key, fields in text_fields.items():
            mdt = MDTextField(id=key, helper_text_mode="on_focus")
            for subfield, value in fields.items():
                mdt.subfield = str(value)
            mdt.bind(on_text_validate=partial(app.on_text_validate, text_fields[key]["self"]))
            self.add_widget(mdt)


class MainApp(App):
    title = "KivyMD MDTextField Demo"
    theme_cls = ThemeManager()

    def build(self):
        return RootWidget()

    def on_text_validate(self, value, obj):
        print("\napp.on_text_validate:")
        print("\tobj=", obj)
        print("\tvalue=", value)
        print("\tobj.text=", obj.text)


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

Output

Img01


我已经为你的回答点赞了,但是似乎新用户不能接受点赞。我需要一些时间来将这个解决方案应用到我的问题上。如果成功了,我会接受这个答案。 - New2Coding
我很难将这个过程应用到我的问题上,因为我的布局要复杂得多。但是我会接受这个答案,因为它似乎适用于我所提供的示例。感谢您的耐心。 - New2Coding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接