2017-08-28 70 views
0

當我實例化兩個類(MainBoxLayout和連接)這樣的應用程序類:訪問其他控件實例

class MartyApp(App, BoxLayout): 

def build(self): 
    self.title = 'Marty Robot App' 
    self.orientation = 'vertical' 
    self.add_widget(MainBoxLayout()) 
    self.add_widget(Connection()) 
    return self 

我如何可以訪問Connection類/實例中的<MainBoxLayout>:部分我的kivy文件?在這裏:

<MainBoxLayout>: 
canvas: 
    Color: 
     rgb: [.121, .545, .912] 
    Rectangle: 
     pos: self.pos 
     size: self.size 

<Connection>: 
    available_martys: spinner_discovered_martys.values 
    rows: 4 
    cols: 1 
    padding: 5 

我試圖創建的MartyApp類實例化一個Connection類,它作爲參數傳遞給MainBoxLayout類,並返回該實例,但後來我的應用程序崩潰直,我不知道爲什麼。

下面的例子:

class MartyApp(App, BoxLayout): 
    conncetion = Conncetion() 

def build(self): 
    return MainBoxLayout(conncetion) 

回答

1

你可以做這樣的事情在你的build方法self.connection = Connection(),然後再獲取的對象與App.get_running_app().connection,或者等價app.connection在千伏代碼。

+0

好了,所以我創造我的'MartyApp'類的'build'方法類的一個對象。當我在.kv文件中放入一個':'時,它會佔用這個對象還是創建另一個對象?或者更一般:將':'或'Connection:'(作爲一個小部件的一部分)創建該類的另一個實例? –

1

你必須聲明一個ObjectProperty來連接你的Connection子窗口小部件。細節請參考下面的例子。

main.py

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.properties import ObjectProperty, NumericProperty 


class Connection(GridLayout): 
    value = NumericProperty(0) 


class MainBoxLayout(BoxLayout): 

    avail_martys = ObjectProperty(None) 

    def __init__(self, **kwargs): 
     super(MainBoxLayout, self).__init__(**kwargs) 
     self.access_connection() 

    def access_connection(self): 
     print(self.avail_martys.value) 


class MartyApp(App): 

    def build(self): 
     self.title = "Marty Robot App" 
     return MainBoxLayout() 


if __name__ == "__main__": 
    MartyApp().run() 

marty.kv

#:kivy 1.10.0 

<Connection>: 
    GridLayout: 
     rows: 4 
     cols: 1 
     padding: 5 

<MainBoxLayout>: 
    avail_martys: conn 

    canvas: 
     Color: 
      rgb: [0.121, .545, 0.912] 
     Rectangle: 
      pos: self.pos 
      size: self.size 

    BoxLayout: 
     orientation: "vertical" 

    Connection: 
     id: conn 
+0

我有點困惑。我現在可以在':'小部件中訪問':'小部件的屬性或實例化的Conncetion:'類嗎?或者它們是相同的,因爲它們共享相同的類屬性而不是實例的'self.value'屬性? –

+1

MainBoxlayout類然後 – ikolim

+1

是在kv規則文件中添加的小部件。 Connection是小部件規則中的子小部件。當在構建方法中實例化類MainBoxLayout時,它將完成實例化實際屬性和其他類的工作。您將訪問實例化的Connection類的屬性/變量。 – ikolim