2017-08-28 11 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 

私はの<MainBoxLayout>:一部にConnectionクラス/インスタンスにアクセスするにはどうすればよいです私のキビーファイル?ここで:

<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

あなたは、後でApp.get_running_app().connectionと、そのオブジェクトを取得し、または同等にapp.connection KVコードでは、ビルド方法にself.connection = Connection()ような何かを行うことができます。

+0

わかりましたので、私は 'MartyApp'クラスの' build'方法では、そのクラスのオブジェクトを作成します。私が ':'を.kvファイルに入れると、このオブジェクトを取るか、代わりに別のオブジェクトを作成しますか?またはより一般的です: ':'または 'Connection:'(ウィジェットの一部として)はそのクラスの別のインスタンスを作成しますか? –

1

Connectionの子ウィジェットに接続するためにObjectPropertyを宣言する必要があります。詳細は以下の私の例を参照してください。

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クラスがbuildメソッドでインスタンス化されると、実際の属性や他のクラスをインスタンス化するための作業が行われます。インスタンス化されたConnectionクラスのプロパティ/変数にアクセスします。 – ikolim

関連する問題