Ошибка атрибута с супер в Kivy / Python - PullRequest
0 голосов
/ 25 августа 2018

Вот фрагмент моего кода на стороне .py, вызывающий проблему:

class ScreenMath(Screen):

    def __init__(self,**kwargs):
        super(ScreenMath,self).__init__(**kwargs)
        self.ids.anchmath.ids.grdmath.ids.score.text = str("Score:" + "3")

И сторона .kv:

<ScreenMath>:
    AnchorLayout:
        id: "anchmath"
        ...    
        GridLayout:
            id: "grdmath"
            ...
            Button:
                id: "score"

Когда я запускаю код, возникает ошибка AttributeError:

    File "kivy\properties.pyx", line 841, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

Как вы видели, я хочу изменить текст моего значения (3 будет позже переменной), когда экран будет запущен, но, возможно, есть лучший способ сделать это.

1 Ответ

0 голосов
/ 25 августа 2018

Проблема - AttributeError

    File "kivy\properties.pyx", line 841, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

Основная причина

Kivy не удалось найти атрибут, поскольку id в вашем файле kv были назначены строковые значения.

Решение

Для решения проблемы необходимы следующие изменения.

  1. id s в файле kv не являются строками.Поэтому удалите двойную кавычку из id.
  2. Замените self.ids.anchmath.ids.grdmath.ids.score.text на self.ids.score.text.

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

Предупреждение

При назначении значения идентификатору, помните, что значение не является строкой.Кавычек нет: хорошо -> id: значение, плохо -> id: 'значение'

язык Kv »self.ids

Когда ваш файл kv анализируется, kivy собирает все виджеты с тегами id и помещает их в это свойство типа словаря self.ids.Это означает, что вы также можете перебирать эти виджеты и обращаться к ним в стиле словаря:

for key, val in self.ids.items():
    print("key={0}, val={1}".format(key, val))

Snippet - код Python

class ScreenMath(Screen):

    def __init__(self,**kwargs):
        super(ScreenMath,self).__init__(**kwargs)
        self.ids.score.text = str("Score:" + "3")

Snippet-kv file

<ScreenMath>:
    AnchorLayout:
        id: anchmath
        ...    
        GridLayout:
            id: grdmath
            ...
            Button:
                id: score

Выход

Img01

...