AttributeError: el objeto ‘super’ no tiene ningún atributo ‘__getattr__’ al intentar agregar un widget a una identificación personalizada de diseño

al intentar agregar un widget (un diseño en el problema) a una identificación personalizada que modifico en la presentación, me lanza un error que creo que no identifico la identificación personalizada

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) 

Aqui todo el codigo

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

los resultados son:

 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__' 

Problema 2

Se mantuvo agregando widgets de DatosLayoutCI al último widget, gr_ly

Solución

Para mostrar todo el material (MATERIALES) debajo de cada sección (SECCIONES), uno tiene que usar una instrucción SQL con INNER JOIN o dos instrucciones SELECT (SELECT anidadas).

Fragmentos – SELECTs nesteds

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

Problema 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__' 

Razón

Los identificadores creados en el script de Python son diferentes de los identificadores creados en el archivo kv.

Documentación Kivy

Kv Language »Widgets de Referencia

Kv Language »Acceda a los widgets definidos dentro de Kv lang en su código de python

Diferencias

archivo kv

  • Cuando asigne un valor a id, recuerde que el valor no es una cadena. No hay comillas: bueno -> id: value , mal -> id: 'value'
  • Acceda a él en el script Python utilizando self.ids.realll o self.ids['realll']
  • Cuando se analiza el archivo kv, kivy recostack todos los widgets etiquetados con ID y los coloca en esta propiedad de tipo self.ids dictionary. Eso significa que también puede recorrer estos widgets y acceder a ellos con el estilo de diccionario.

archivo py

  • El id es una cadena
  • No se puede acceder usando self.ids.var
  • No almacenado en self.ids

Solución

 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