Kivy:AttributeError:“标签”对象没有属性“ a”

时间:2019-06-24 19:57:46

标签: python kivy kivy-language

我制作了一个简单的应用程序,其中有两个同时运行的计时器。一个倒数,另一个倒数。

我最初尝试在Label下缩进“ 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 个答案:

答案 0 :(得分:1)

问题在于变量的范围,.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的{​​{1}}的属性将采用与b中的bar_property相同的值。它与python类中的用法相同。

-b

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的{​​{1}}与property_d: root.bar_property的{​​{1}}具有相同的值。


考虑到上述情况,以下也是解决方案:

1。

property_d

2。

d