2016-10-01 78 views
0

好让说,我想这个标签在一些小部件使用的文本来自标签其他窗口内:如何从Kivy中的其他窗口部件访问某些窗口小部件属性?

<[email protected]>: 
    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

<[email protected]>: 
    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. 一般来说,从另一个小部件访问某些小部件属性的最佳方式是什么?我可以使它独立于小部件层次结构吗?

回答

2
  1. 对象属性l可能被填充第一事件循环迭代后,而你正在试图内的第一个访问它。你可以延迟它直到第二次迭代才能使它工作。

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

BoxLayout 

    Label 
     id: label 
     text: 'hello world' 

    SubWidget 
     label_text: label.text 

<[email protected]> 
    label_text: 'none' 

    Label 
     text: root.label_text 
相关问题