2016-04-29 21 views
1

場合によってはObjectPropertyは適切ではありません。これは、オブジェクトの値が変更されたときにのみイベントを発生させるためです。Kivyでカスタムプロパティを作成する方法はありますか?

しかし、オブジェクトの属性が変更されるとどうなりますか?イベントは発生しません。

クラスを考えてみましょう:

class Point(object): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

そしてKivyウィジェット:私はおよそpoint何かを変更する場合

class MyWidget(Widget): 
    point = ObjectProperty() 

    def __init__(self, point): 
     super(MyWidget, self).__init__() 
     self.point = point 

    def on_point(self, obj, value): 
     # do something 

はどうなりますか?

w = MyWidget(Point(0, 0)) 
w.point.x = 10 
# callback not called! 

限りObjectPropertyに関しては、pointが変更されていないため、コールバックが呼び出されませんでした。しかし、私はxyへの変更を変更としてカウントし、イベントを発生させたいと思います。

ListPropertyは、リストの長さが変更されたときにイベントを発生させることを知っています。

このため、PropertyサブクラスPointPropertyを作成する必要があると思います。

しかし、それを行う方法に関する文書は見つかりませんでした。ヘルプをいただければ幸いです。

答えて

0

このために新しいプロパティタイプを作成する必要はありません。小さなものから大きなものを作りなさい。それらをxyの数値プロパティにします。その後

class Point(EventDispatcher): 

    x = NumericProperty(0) 
    y = NumericProperty(0) 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def on_x(self, obj, value): 
     print 'x changed:', value 

    def on_y(self, obj, value): 
     print 'y changed:', value 

w = MyWidget(Point(0, 0)) 
w.point.x = 10 
# 'x changed: 10' 
+0

ニースのアイデアが、それはまだ完璧ではありません。 Kivyと関係のない第三者のクラスを使用している場合はどうなりますか?また、私はKivyの 'Vector'クラスを使用していますが、これはこのように構築されていません(これが私をこの質問に導きました)。 –

+0

@zeeMonkeezこれを指摘していただきありがとうございます。 – jligeza

+0

@AvivCohn *全体の*オブジェクトの変更を追跡するのは無意味です。無駄な計算が増え、アプリケーションが遅くなるからです。私はあなたが外部クラスオブジェクトのすべてのフィールドを追跡しようとすることで、正確に何をしようとしているのか分かりません。しかし、とにかくそれを包むことができます。 – jligeza