python - Kivy 如何从 kivy 中的字典创建小部件

标签 python kivy dry

我是 Python 库 kivy 的新手。我找到了额外的库 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 小部件。

有没有办法实现我想要的?

最佳答案

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

例子

主.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()

输出

Img01

关于python - Kivy 如何从 kivy 中的字典创建小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52011191/

相关文章:

python - 在 kivy 中嵌套小部件

javascript - Jquery - (重新)连接动态生成的元素

javascript - 在下面的 JavaScript 情况下,如何避免重复自己的情况?

C# lambda 内容在被调用之前不会发生,对吗?另外,代码清理

python - 为什么列表是共享的而不是 python 中的变量(类级别)

python - 如何在dask中实现相对频率函数?

python - 如何在 Kivy Python 中显示数学文本?

python - 将 kivy 纹理转换为 opencv 图像

python - Odoo session 随机过期

python - 如何减少 DataFrame 中的行数,聚合给定列中的相同值?