Как установить идентификатор для виджетов в kivy из файла кода python

#python #kivy #kivy-language #kivymd

Вопрос:

 class NavigationDrawer(MDApp):
def build(self):
    return Builder.load_string(KV)

def on_start(self):

    files=[{"price":"890" , "meter" : "36" , "elevator" : "True"}]

    for file in files:
        first_base_el = MDCard(size_hint=(1, None), size=(self.root.width,
              self.root.height / 4))
        second_base_el =BoxLayout(orientation='vertical')

        for element in file.keys() :

            external_el = MDRectangleFlatButton(
                    text=f'{element} : {file[element]}',
                    size_hint=(1, .2)
            )

            second_base_el.add_widget(external_el)

        first_base_el.add_widget(second_base_el)
        self.root.ids.container.add_widget(first_base_el)
 

Я получаю эту ошибку : self.ids[элемент] = weakref.ref(external_el)
Ошибка атрибута: объект ‘NavigationDrawer’ не имеет атрибута ‘идентификаторы’

Ответ №1:

«Идентификатор», назначенный из кода python, не работает как «идентификатор» из kivy lang, лучший способ ссылаться на виджет, добавленный из кода python, — это использовать атрибут «дети» или «родитель», получить нужный виджет из дерева виджетов и использовать его по вызову или по объекту

В вашем примере в «first_base_el» есть добавленные вами виджеты, поэтому для получения уже добавленного виджета вам следует использовать:

B=first_base_el.дети

Card=B[0] #это равно виджету «second_base_el»

Ответ №2:

Да , это потому, что прямо не в строке self.root.ids.container.add_widget(first_base_el) self ссылается на класс приложений, и затем вы получаете доступ к корню класса приложений, который является самим собой.

У класса приложений нет никакого атрибута ids . Только классы виджетов будут иметь атрибут id для доступа