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

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], как могут предположить некоторые.

-1
задан eyllanesc 25 March 2019 в 04:18
поделиться

1 ответ

Проблема 2

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

Решение

Для отображения всего материала (МАТЕРИАЛЫ ) в каждом разделе (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
0
ответ дан ikolim 25 March 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: