AttributeError:“按钮”对象没有属性“ update_label”。

时间:2018-11-02 05:20:01

标签: python kivy

我坚持使用我的代码,请您帮忙吗?在将on_press添加到我的kv文件并描述了函数update_label之后,出现错误:

AttributeError: 'Button' object has no attribute 'update_label'. 

即使我使用简单的print()函数更改了对函数的描述,也无法正常工作。预先感谢!

from kivy.app import App    
from kivy.uix.boxlayout import BoxLayout    
from kivy.lang import Builder    
from kivy.uix.button import Button    
from kivy.uix.label import Label    
from kivy.uix.stacklayout import StackLayout    
from kivy.uix.textinput import TextInput


Builder.load_file('spain2.kv')

class Box2(BoxLayout):
    pass

class Box1(StackLayout):
    pass


class Ex42App(App):
    def update_label(self):    
        if self.l1.text == 'amar':    
            self.l2.text = "Translate: to love"    
        else:    
            self.l2.text = "Infinitive not founded"

    def build(self):    
        return Box2()


if __name__=='__main__':

    Ex42App().run()

spain2.kv:

<Box2>:
    orientation: 'vertical'
    Box1:
        orientation: 'lr-tb'
        size_hint: 1, .1
        Label:
            id: l1
            text: 'Insert Infinitive'
            size_hint: None, None
            size: 150, 30
        TextInput:
            size_hint: None, None
            size: 300, 30
        Button:
            text: 'Find'
            size_hint: None, None
            size: 150, 30
            on_press: self.update_label

    Label:
        id: l2
        text: 'some data'
        size_hint: None, .9

1 个答案:

答案 0 :(得分:0)

.kv中似乎他不知道selfrootapp的含义,在这种情况下,请考虑以下代码:

<A>:
    property_a: self.a
    property_a1: root.a1
    B:
        property_b: self.b
        property_c1: root.b1
        C:
            property_c: self.c
            property_c1: root.c1

在观察到.kv语言时,它是声明性的,并且有层次结构树。

在这种情况下,root指的是第一个元素:<A>

相反,self引用树中的元素,如果self.a引用属性a属于A,对于{{ 1}}是指属性self.c属于c

在app的情况下,是指属于从App继承的类的对象,并且此对象是唯一的,在您的情况下,app的情况是指从Ex42App继承的对象C

因此root和self是相对于层次结构树的,例如,我们可以放置更复杂的结构:

Ex42App()

通过上述内容,我们根据您的代码说<A>: B: some_property1: self.a # self is B some_property2: root.a # root is A <Y>: Z: some_property1: self.a # self is Z some_property2: root.a # root is Y 属于update_label来分析您的情况,但这是不正确的,它属于Button,因此您必须使用{{ 1}},另一方面,App是一个函数,因此您必须使用app来调用它。

另一方面,代码.py指出update_label()属于l1,但它不属于l2,而属于{{1} },但是AppApp仅在Box2内部可见,因此可以在l1之外使用,您必须将它们公开为属性,最后将{{1} }是返回l2的小部件,并且该元素可以通过Box2访问。

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

*。py

Box

*。kv

Box2