如何从 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

所以我有两个问题:

  1. 为什么第二个解决方案不起作用?如何解决?
  2. 一般来说,从另一个小部件访问某些小部件属性的最佳方法是什么?我可以让它独立于小部件层次结构吗?
  1. 对象 属性 l 可能会在 第一次事件循环迭代之后填充,而您正试图在其中访问它首先。您可以将其延迟到第二次迭代以使其工作。

  2. 最强大的方法是从 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