【问题标题】:AttributeError: 'Button' object has no attribute 'update_label'.AttributeError:“按钮”对象没有属性“更新标签”。
【发布时间】:2018-11-02 13:53:20
【问题描述】:

我的代码卡住了,你能帮忙吗?在我将 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()

西班牙2.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

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    他似乎不知道.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 指的是第一个元素:&lt;A&gt;

    self 指的是树中的一个元素,self.a 指的是属性a 属于Aself.c 指的是属性c属于C

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

    所以root和self是相对于一个层次树的,比如我们可以放置一个更复杂的结构:

    <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但这是不正确的,它属于App所以你必须使用app,另一方面update_label 是一个函数,因此您必须使用 () 调用它。

    另一方面,在代码.py中指出l1l2属于App,但这不属于App而是属于Box2,而是l1l2仅在Box2 内部可见,因此它可以在Box 之外使用,您必须将它们作为属性公开,最后Box2 是返回build() 的小部件,并且该元素通过self.root 访问。

    综合以上,解决办法是:

    *.py

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.lang import Builder
    from kivy.uix.stacklayout import StackLayout
    
    
    Builder.load_file('spain2.kv')
    
    class Box2(BoxLayout):
        pass
    
    class Box1(StackLayout):
        pass
    
    
    class Ex42App(App):
        def update_label(self):
            if self.root.l1.text == 'amar': # <--
                self.root.l2.text = "Translate: to love" # <--
            else:
                self.root.l2.text = "Infinitive not founded" # <--
    
        def build(self):
            return Box2()
    
    
    if __name__=='__main__':
        Ex42App().run()
    

    *.kv

    <Box2>:
        l1: l1 # <--
        l2: l2 # <--
        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: app.update_label() # <--
    
        Label:
            id: l2
            text: 'some data'
            size_hint: None, .9  
    

    【讨论】:

    • 非常感谢您的详细解释!!!我真的不明白self和root的区别!!!非常感谢您的帮助和耐心!
    • @ДмитрийПухач 如果我的回答对你有帮助,别忘了标记为正确,如果你不知道怎么做,请查看tour,这是最好的感谢方式。
    猜你喜欢
    • 2020-05-31
    • 2020-03-25
    • 1970-01-01
    • 2019-06-03
    • 2019-01-09
    • 2018-05-12
    • 2012-01-02
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多