如何从Kivy的另一个小部件访问一些小部件属性?

时间:2016-10-01 14:52:14

标签: python kivy kivy-language

好吧,让我说我希望某个小部件中的标签能够使用另一个小部件中的标签中的文字:

<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 个答案:

答案 0 :(得分:2)

  1. 对象属性l可能在第一个事件循环迭代后填充,而您尝试在第一个事件循环中访问它。你可以推迟到第二次迭代才能使它工作。

  2. 最强大的方法是从python代码中绑定这些属性,但是有一些kv lang技巧可以使它更简单。这是我最喜欢的方法:

  3. BoxLayout
    
        Label
            id: label
            text: 'hello world'
    
        SubWidget
            label_text: label.text
    
    <SubWidget@BoxLayout>
        label_text: 'none'
    
        Label
            text: root.label_text