2016-04-29 92 views
1

有時ObjectProperty不適合。這是因爲它只會在對象的值發生更改時引發事件。有沒有辦法在Kivy中創建自定義屬性?

但是,當對象的屬性改變時怎麼辦?事件不會引發。

考慮一類:

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

並有Kivy部件:

class MyWidget(Widget): 
    point = ObjectProperty() 

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

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

當我改變一些關於point會發生什麼?

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