Kivy Как создать виджеты из словаря в Kivy - PullRequest
0 голосов
/ 24 августа 2018

Я новичок в библиотеке кивы для Python. Я нашел дополнительную библиотеку kivy-md, которая имеет очень красивые элементы пользовательского интерфейса. Сейчас я хочу создать множество виджетов 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 из строк словаря, а во-вторых, я не знаю, как зацикливаться на kivy виджетах в файле kv.

Есть ли способ добиться того, чего я хочу?

1 Ответ

0 голосов
/ 25 августа 2018

Обратите внимание, что в 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()

Выход

Img01

...