2016-04-08 12 views
0

kivy、カントのアクセスapp.rootプロパティ

main.py

from kivy.app import App 
from kivy.core.window import Window 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.relativelayout import RelativeLayout 
from kivy.uix.button import Button 
from kivy.uix.screenmanager import ScreenManager, Screen 

class Manager(ScreenManager): 
    currency = '$' 

class SpendApp(App): 
    def build(self): 
     control = Manager() 
     return control 

class First(Screen): 
    pass 

if __name__ == '__main__': 
    SpendApp().run() 

spend.kvを次のように私は私のmain.pyとspend.kvに次のコードを持っている

<Manager>: 
    First 


<First>: 
    GridLayout: 
     cols: 1 
     Label: 
      text: 'Total spending' 
      height: '48dp' 
      size_hint_y: None 
     Amount: 
      height: '38dp' 
      size_hint_y: None 
      font_color: 1,0,0,1 



<[email protected]>: 
    text: app.root.currency + '0.0' 

これを実行すると、次のエラーでプログラムがクラッシュします。

AttributeError: 'NoneType' object has no attribute 'currency' 

私はこれが私のspend.kv ファイルにapp.root.currencyするために私のreferanceである知っている:

<[email protected]>: 
    text: app.root.currency + '0.0' 

ので、正しくこのリファレンスを作るための方法は、このエラーを受信せず、あるのでしょうか?

+0

をあなたはcurrency'が変更されたときに 'ラベルのテキストが自動的に更新されるように、' 'StringProperty'をcurrency'したいことがあります。 – zeeMonkeez

答えて

2

次のコードを使用する場合:

<[email protected]>: 
    text: str(root) # 

をあなたがそれを定義しているとき、それはまだ階層ではないのでAmountオブジェクトのルートがAmountオブジェクトそのものであることを発見するでしょう。あなたが唯一の実際の階層内widged rootにアクセスすることができます。

<First>: 
    GridLayout: 
     cols: 1 
     Label: 
      text: str(root) 

この階層では、rootオブジェクトは、実際にScreenウィジェットのインスタンスであるFirstクラスのオブジェクトとしてdefiniedので、あなたは順番にmanager属性を使用する必要がありますされますあなたのManagerクラスアクセスもする:

<First>: 
    GridLayout: 
     cols: 1 
     Label: 
      text: root.manager.currency + '0.0'