2016-04-27 19 views
3

私は、フィールドが3つ、absumのクラスがあるとします。 3番目の値は、常にabの合計に等しくなければなりません。Kivyでレイジープロパティを作成するにはどうすればよいですか?

は、純粋なPythonでは、これは単に実装されていたであろう:Kivyでしかし

class MyClass(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    @property 
    def sum(self): 
     return self.a + self.b 

、我々はフレームワークのプロパティ記述子を使用することをお勧めします。 sumを含む前に、クラスは次のようになります。

class MyClass(Widget): 
    a = NumericProperty() 
    b = NumericProperty() 

    def __init__(self, a, b, **kwargs): 
     super(MyClass, self).__init__(**kwargs) 
     self.a = a 
     self.b = b 

しかし、どのように私はsumプロパティを実装する必要がありますか?私は良いオール '@propertyを使用することができます。しかし、代わりにKivy Propertyオブジェクトを使用してはいけませんか?

これを達成するためのKivyのベストプラクティスは何でしょうか?

+0

あなたはNumericPropertyが実際に何をするかに見えたことがありますか? sumプロパティを通常どおりにすることができ、 'sum = NumericProperty'を実行することも可能です – TankorSmash

+0

sumにアクセスするまでsumを評価したくない場合は、通常のpythonプロパティを使っても問題ありません。 self.aまたはself.bが変更されるたびに再評価されるようにするには、kvルール 'sum:self.a + self.b'を使用してNumericPropertyを使用できます。 Kivyのイベントシステムと一緒に。 – inclement

答えて

1

一般にプロパティは、クラスフィールドの内容をウィジェットに表示するのに役立ちます。あなたはそれらを使うことができます。

一部のウィジェットで@propertyメソッドを作成し、update_sum(..)メソッドを作成して、ボタンのプレスで新しい合計をラベルに書き換えることができます。

alias propertyを作成し、合計が変更されるたびにラベルを更新することで自動的に行うことができます。そのため、ボタンをクリックして更新する必要はありません。

main.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import NumericProperty, AliasProperty 


class RootBox(BoxLayout): 

    a = NumericProperty() 
    b = NumericProperty() 

    def get_sum(self): 
     return float(self.a + self.b) 

    def set_sum(self, value): 
     self.sum = value 

    sum = AliasProperty(get_sum, set_sum, bind=['a', 'b']) 

    def on_sum(self, obj, value): 
     self.ids.sum_label.text = str(value) 


class Test(App): 
    pass 


Test().run() 

test.kv

RootBox: 
    orientation: 'vertical' 

    Label: 
     id: sum_label 

    BoxLayout: 
     orientation: 'vertical' 

     TextInput: 
      on_text: root.a = float(self.text) if self.text else 0 
     TextInput: 
      on_text: root.b = float(self.text) if self.text else 0 
+0

AliasPropertyが良好に見えます。私は 'bind'パラメータが何のためにあるのか分からない。なぜセッターとゲッターを設定した後に必要なのでしょうか? –

+0

@AvivCohnこれは、プロパティ 'a'と' b'のセッターをバインドします。これらの単一のプロパティが変わるたびに、 'on_sum'メソッドを実行して合計に影響します。私の答えには、ドキュメントへのリンクがあります。 – jligeza

関連する問題