Kivy: AttributeError: у объекта 'Label' нет атрибута 'a' - PullRequest
1 голос
/ 24 июня 2019

Я сделал простое приложение, которое имеет два таймера, которые работают одновременно.Один отсчитывает, а другой отсчитывает.

Первоначально я попытался указать «text: str (round (self.a, 1))» с отступом под меткой, и возникнет ошибка, указанная в названии.Теперь я решил проблему, адаптировав свой код, как показано ниже (изменения были внесены в конец файла .kv в конце):

from kivy.app import App
from kivy.uix.label import Label
from kivy.animation import Animation
from kivy.properties import NumericProperty
from random import randint
from kivy.uix.boxlayout import BoxLayout

class PleaseWork(BoxLayout):
    a = NumericProperty(randint(3,7))
    b = NumericProperty(0)

    def start(self):

        self.anim = Animation(a=0, duration=self.a)
        self.anim &= Animation(b=15, duration=15)
        self.anim.repeat = True
        self.anim.start(self)


class PleaseApp(App):
    def build(self):
        p = PleaseWork()
        p.start()
        return p

if __name__ == "__main__":
    PleaseApp().run()


<PleaseWork>
    orientation: 'vertical'
    text_1: str(round(self.a, 1))
    text_2: str(round(self.b, 1))
    Label:
        text: root.text_1
    Label:
        id: count_up
        text: root.text_2

Пока код выполняет то, что должен,мой вопрос, почему это исправило ошибку?Я не очень понимаю, почему это имеет значение?

1 Ответ

1 голос
/ 24 июня 2019

Проблема заключается в области видимости переменных, в .kv есть по крайней мере следующие способы доступа к элементу:

- id:

<A>:
   id: a
   property_a: b.foo_property
   <B>: 
       id: b
       property_b: a.bar_property

Используется для ссылки на любой узел в дереве.

- self:

<A>:
    property_a: self.foo_property
    B:
        property_b: self.bar_property

Когда используется self, это означает, что тот же самый узел ссылается на себя, в предыдущем примере property_b: self.bar_property указано, что свойство property_b из b будет принимать то же значение, что и bar_property из b. Он используется так же, как и в классах Python.

- root:

<A>:
    B:
        property_b: root.bar_property

<C>:
    D:
        property_d: root.bar_property

Использование root при ссылке на корень дерева, например, property_b: root.bar_property указывает, что property_b из b примет то же значение, что и bar_property из a. И в случае property_d: root.bar_property это означает, что property_d из d будет иметь то же значение, что и bar_property из c.


Учитывая вышеизложенное, также возможны следующие решения:

1

<PleaseWork>
    orientation: 'vertical'
    Label:
        text: str(round(root.a, 1))
    Label:
        id: count_up
        text: str(round(root.b, 1))

2

<PleaseWork>
    orientation: 'vertical'
    id: please_work
    Label:
        text: str(round(please_work.a, 1))
    Label:
        id: count_up
        text: str(round(please_work.b, 1))
...