myList = [[1]*4] * 3
создает один объект списка [1,1,1,1]
в памяти и копирует его ссылку 3 раза. Это эквивалентно obj = [1,1,1,1]; myList = [obj]*3
. Любая модификация obj
будет отражена в трех местах, где obj
упоминается в списке. Правильным утверждением будет:
myList = [[1]*4 for _ in range(3)]
или
myList = [[1 for __ in range(4)] for _ in range(3)]
. Важно отметить, что *
оператор в основном используется для создания список литералов. Поскольку 1
является литералом, значит, obj =[1]*4
создаст [1,1,1,1]
, где каждый 1
будет атомарным, а не ссылкой 1
, повторяемым 4 раза. Это означает, что если мы obj[2]=42
, то obj
станет [1,1,42,1]
не [42,42,42,42]
, как могут предположить некоторые.
Продолжала добавлять виджеты DatosLayoutCI к последнему виджету, gr_ly
blockquote>Решение
Для отображения всего материала (МАТЕРИАЛЫ ) в каждом разделе (SECCIONES) необходимо использовать либо один оператор SQL с INNER JOIN, либо два оператора SELECT (вложенные операторы SELECT).
Фрагменты - вложенные 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
Kv Language »Ссылки на виджеты
Kv Language» Доступ к виджетам, определенным внутри Kv lang в вашем коде Python
Различия
kv file
- При назначении значения id помните, что значение не является строкой. Кавычек нет: хорошо ->
id: value
, плохо ->id: 'value'
- Получите доступ к нему в скрипте Python, используя
self.ids.realll
илиself.ids['realll']
- Когда ваш файл kv анализируется, kivy собирает все виджеты, помеченные идентификаторами, и помещает их в это свойство типа словаря
self.ids
. Это означает, что вы также можете перебирать эти виджеты и обращаться к ним в стиле словаря.py file
id
является строкой- Невозможно получить к ней доступ, используя
self.ids.var
- Не хранится в
self.ids
[ 1128]Решение
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