我坚持使用我的代码,请您帮忙吗?在将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
答案 0 :(得分:0)
.kv中似乎他不知道self
,root
和app
的含义,在这种情况下,请考虑以下代码:
<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} },但是App
和App
仅在Box2
内部可见,因此可以在l1
之外使用,您必须将它们公开为属性,最后将{{1} }是返回l2
的小部件,并且该元素可以通过Box2
访问。
考虑到上述情况,解决方案是:
*。py
Box
*。kv
Box2