2016-04-29 90 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