2016-10-31 3 views
3

:このSO questionからキビー画面。スーパーで初期化する必要がありますか? <a href="https://kivy.org/docs/api-kivy.uix.screenmanager.html" rel="nofollow noreferrer">docs</a>から

# Declare both screens 
class MenuScreen(Screen): 
    pass 

class SettingsScreen(Screen): 
    pass 

class WelcomeScreen(Screen): 
    def __init__(self, **kwargs): 
     super(Screen,self).__init__(**kwargs) 

superと理由で画面を初期化することが必要である状況下では?

答えて

5

短い答え:

ありませんあなたは画面を定義するときに、スーパー使用する必要はありません。はい、あなたはいつも__init__にスーパーを持っていなければなりません(__init__を使用する場合)。

長い答えは:

それはスクリーンに固有の何もありません。ドキュメントの例では、__init__を呼び出していないので、何もパラメータを渡さないので、superは必要ありません。 __init__コールを使用してKivyスクリーンを定義する必要はありません。 SOの質問から、__init__を実行している場合は、オブジェクト階層の上に** kwargsを渡し、通常は親クラスの初期化を実行する__init__を再定義します。 superは、** kwargsを渡して、親クラスへの明示的な呼び出しなしで親__init__を実行できるようにするために使用されます。ScreenRelativeLayoutから継承され、それ自体はFloatLayoutから継承されます。スーパーコールがなければ、親クラスをオーバーライドします。

ご使用の場合を除き、__init__に電話する必要はありません。あなたは、レイアウト、コンテンツ、プロパティを設定したい場合は

class LoginScreen(Screen): 
    def login(self): 
     self.parent.current = 'ParameterScreen' 

あなたは、などを__init__を使用します。ここではありません__init__コール(レイアウトが.kvファイルに設定されている)で、私のアプリケーションの1からScreenです.kvファイルでこれらのものを定義せずに作成したクラスをインスタンス化した瞬間の画面のこれを行うには、上記のようにスーパーが必要になります。可能であれば、.kvファイルを使用するのは、kivyでも良い方法です。

この例では、self.callerを持つBottomBarの親にアクセスできるようにしたいと思います。作成する際に** kwargsとして渡し、バーがインスタンス化されるとすぐにこれを定義します。スーパーコールが必要な__init__に定義する必要があります。

class BottomBar(ActionBar): 
    titletext = StringProperty('') 
    def __init__(self,**kwargs): 
     self.caller = kwargs.get('caller') 
     super(BottomBar,self).__init__(**kwargs) 
    def change_title(self,newtitle): 
     self.titletext = newtitle 
+0

私は、この例のように、スーパーずに継承する場合には、どういう意味:https://github.com/kivy/kivy/wiki/Data-driven-variables-with-kivy-properties、私は変更することができます実行時にルートウィジェットで生成される可能性のあるアクセス権変数(例えば、パイプオブジェクトから取得された変数)? – Moritz

+0

@Moritz __init__を使用している場合は、親クラスの__init__などを呼び出すデフォルトの初期化を上書きします。スーパーコール、または明示的に名前が付けられたBaseClass .__ init __()が必要です。 superでは、親クラスにパラメータを渡すことができます。 – Daniel

関連する問題