好吧,让我说我希望某个小部件中的标签能够使用另一个小部件中的标签中的文字:
<SubWidget@RelativeLayout>:
Label:
text: str(root.parent.ids.first.text)
<RootWidget>:
Label:
id: first
center_x: 100
text: "text"
SubWidget:
id: second
center_x: 200
这有效,但似乎不是很好的解决方案。如果我将first
放在另一个小部件中,我需要在代码中的任何位置更改对它的引用(这可能会导致错误)。
我的第一个想法是至少在根级别存储对first
的引用并引用它:
<SubWidget@RelativeLayout>:
Label:
text: str(root.parent.l.text)
<RootWidget>:
l: first
Label:
id: first
center_x: 100
text: "text"
SubWidget:
id: second
center_x: 200
但这会导致异常:
AttributeError: 'NoneType' object has no attribute 'text'
这很令人困惑,因为如果我写text: str(root.parent.l)
之类的内容,我会看到Label object
而不是NoneType
。
所以我有两个问题:
答案 0 :(得分:2)
对象属性l
可能在第一个事件循环迭代后填充,而您尝试在第一个事件循环中访问它。你可以推迟到第二次迭代才能使它工作。
最强大的方法是从python代码中绑定这些属性,但是有一些kv lang技巧可以使它更简单。这是我最喜欢的方法:
BoxLayout Label id: label text: 'hello world' SubWidget label_text: label.text <SubWidget@BoxLayout> label_text: 'none' Label text: root.label_text