如何从 Kivy 中的另一个小部件访问某些小部件属性?
How to access some widget attribute from another widget in Kivy?
好吧,假设我希望某个小部件中的标签使用另一个小部件中标签中的文本:
<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
。
所以我有两个问题:
- 为什么第二个解决方案不起作用?如何解决?
- 一般来说,从另一个小部件访问某些小部件属性的最佳方法是什么?我可以让它独立于小部件层次结构吗?
对象 属性 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
好吧,假设我希望某个小部件中的标签使用另一个小部件中标签中的文本:
<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
。
所以我有两个问题:
- 为什么第二个解决方案不起作用?如何解决?
- 一般来说,从另一个小部件访问某些小部件属性的最佳方法是什么?我可以让它独立于小部件层次结构吗?
对象 属性
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