AttributeError: у объекта 'super' нет атрибута '__getattr__' при попытке добавить виджет в персонализированный идентификатор Layout - PullRequest
0 голосов
/ 24 марта 2019

при попытке добавить виджет (макет в задаче) к персонализированному идентификатору, который я изменяю в макете, он выдает ошибку, которая, как мне кажется, не идентифицирует идентификатор персонализированного

gr_ly = GridLayout(id=i[1], rows=1)

self.LayoutGeneralCI.ids.realll.add_widget(gr_ly)

#Adding another widget to the custom id layout but just always puts me the widgets into the last layout executed

gr_ly.add_widget(self.DatosLayoutCI)

Здесь весь код

def selection_data_secciones(self):

    self.mainwid.dataBase = sqlite3.connect("UserData")
    self.mainwid.dataCursor = self.mainwid.dataBase.cursor()
    self.mainwid.dataCursor.execute("SELECT * FROM SECCIONES")
    fetch = self.mainwid.dataCursor.fetchall()
    for i in fetch:
        self.LayoutGeneralCI = LayoutGeneralCI(self.mainwid)  
        ref_idd = i[1]
        gr_ly = GridLayout(id=i[1], rows=1)
        print(type(gr_ly.id))
        self.LayoutGeneralCI.ids.realll.add_widget(gr_ly)
        print(self.LayoutGeneralCI.ids)
        self.LayoutGeneralCI.ids.title_sect_lbl.text = i[1]
        self.ids.container_ci.add_widget(self.LayoutGeneralCI) 
    for produ in self.mainwid.dataCursor.execute("SELECT * FROM MATERIALES"):
        self.DatosLayoutCI = DatosLayoutCI(self.mainwid)
        txtvar_ci = "Nombre: [b]{}[/b] \n".format(produ[1])
        txtvar2_ci = "Proveedor: [b]{}[/b] \n".format(produ[3])
        if produ[8] <= str(0):
            txtvar3_ci = "Disponibilidad: [color=#FF0000][b]Agotado[/b][/color]" 
        else:
            txtvar3_ci = "Disponibilidad: [color=#00FF00][b]Disponible[/b][/color]"
        txtvargeneral_ci = txtvar_ci + txtvar2_ci + txtvar3_ci
        self.DatosLayoutCI.ids.content_cill.text = txtvargeneral_ci
        var_sectttion = self.mainwid.AgregarProductos.ids.section_product.text#
        var_reference_id = produ[2]  
        gr_ly.add_widget(self.DatosLayoutCI)
    self.mainwid.dataBase.commit()   #DISCOMMENT NECCESARY
    self.mainwid.dataBase.close()

результаты:

self.LayoutGeneralCI.ids.var.add_widget(self.DatosLayoutCI)
File "kivy\properties.pyx", line 841, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

1 Ответ

0 голосов
/ 24 марта 2019

Задача 2

Продолжал добавлять виджеты DatosLayoutCI к последнему виджету, gr_ly

Решение

Чтобы отобразить весь материал (МАТЕРИАЛЫ) в каждом разделе (SECCIONES), необходимо использовать либо один оператор SQL с INNER JOIN, либо два оператора SELECT (вложенные SELECTs).

Snippets - вложенные SELECTs

def selection_data_secciones(self):

    self.mainwid.dataBase = sqlite3.connect("UserData")
    self.mainwid.dataCursor = self.mainwid.dataBase.cursor()
    self.mainwid.dataCursor.execute("SELECT * FROM SECCIONES")  # Sections
    fetch = self.mainwid.dataCursor.fetchall()

    for i in fetch:
        self.LayoutGeneralCI = LayoutGeneralCI(self.mainwid)
        ref_idd = i[1]
        gr_ly = GridLayout(id=i[1], rows=1)
        ...

        self.mainwid.dataCursor.execute("SELECT * FROM MATERIALES WHERE id=?", (gr_ly.id))
        materials = self.mainwid.dataCursor.fetchall()

        for produ in materials:
            self.DatosLayoutCI = DatosLayoutCI(self.mainwid)    # Datos = Data
            ...    
            gr_ly.add_widget(self.DatosLayoutCI)

    self.mainwid.dataBase.commit()   #DISCOMMENT NECCESARY
    self.mainwid.dataBase.close()

Задача 1

self.LayoutGeneralCI.ids.var.add_widget(self.DatosLayoutCI)
File "kivy\properties.pyx", line 841, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

Причина

Идентификаторы, созданные в скрипте Python, отличаются от идентификаторов, созданных в файле kv.

Kivy Documentation

Kv Language »Ссылки на виджеты

Kv Language »Доступ к виджетам, определенным внутри Kv lang в вашем коде Python

Различия

файл kv

  • При назначении значения идентификатору, помните, что значение не является строкой. Кавычек нет: хорошо -> id: value, плохо -> id: 'value'
  • Получите доступ к нему в скрипте Python, используя self.ids.realll или self.ids['realll']
  • Когда ваш файл kv анализируется, kivy собирает все виджеты, помеченные идентификаторами, и помещает их в это свойство self.ids словаря. Это означает, что вы также можете перебирать эти виджеты и обращаться к ним в стиле словаря.

py файл

  • id - это строка
  • Невозможно получить к нему доступ, используя self.ids.var
  • Не хранится в self.ids

Решение

gr_ly = GridLayout(id=str(i[1]))

#####adding a widget to the personalized id of layout

gr_ly.add_widget(self.DatosLayoutCI)

self.LayoutGeneralCI.ids.realll.add_widget(gr_ly)

#######all the code is in a function so i want to créate a layout that will #######contain the widgets with a personalized id and then calling the #######personalized id to add the widget in different and specific layouts##

####defining the layout and it's personalized id and adding to the class

gr_ly = GridLayout(id=str(i[1]))

#####adding a widget to the personalized id of layout

gr_ly.add_widget(self.DatosLayoutCI)

self.LayoutGeneralCI.ids.realll.add_widget(gr_ly)#####1 PRIMERA OPCION
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...