有没有办法在Kivy中创建自定义属性?

时间:2016-04-29 20:22:36

标签: python user-interface events kivy subclassing

有时ObjectProperty不合适。这是因为它只会在对象的值发生变化时引发事件。

但是当对象的属性发生变化时呢?不会引发事件。

考虑一个班级:

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

但我还没有找到关于如何做到这一点的文档。帮助将不胜感激。

1 个答案:

答案 0 :(得分: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'