Kivy как создать виджеты из словаря в kivy
Я новичок в библиотеке kivy для 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"])
Я вижу в этой проблеме две проблемы, которые я не в состоянии решить. Во-первых, как разобрать значения идентификаторов из строк словаря, а во-вторых, что я делаю не знаю, как сделать петлю над виджетами kivy в файле kv.
Есть ли способ достичь того, чего я хочу?1 ответ:
Обратите внимание, что никаких атрибутов,
self
иkey
в KivyMD MDTextField. В примере мы используем вложенный цикл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()
Вывод