有时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
未发生变化。但我希望将x
和y
的更改计为更改并举起活动。
类似于ListProperty
知道在列表长度发生变化时引发事件的方式。
为此,我想我需要创建一个Property
子类PointProperty
。
但我还没有找到关于如何做到这一点的文档。帮助将不胜感激。
答案 0 :(得分:0)
您无需为此创建新的属性类型;用小东西建立大事。制作x
和y
个数字属性。
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'