2016-10-01 75 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 
相關問題