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

Python 有没有办法在Kivy中创建自定义属性?,python,user-interface,events,kivy,subclassing,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__(

有时
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
当我更改有关
点的内容时会发生什么情况

w = MyWidget(Point(0, 0))
w.point.x = 10
# callback not called!
未调用回调,因为就
ObjectProperty
而言,
point
没有更改。但是我希望对
x
y
的更改被计算为更改并引发一个事件

类似于
ListProperty
知道在列表长度更改时引发事件的方式

为此,我想我需要创建一个
属性
子类
PointProperty


但我还没有找到关于如何做到这一点的文档。非常感谢您的帮助。

您不需要为此创建新的属性类型;从小事做起大事。将这些
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
然后


不需要为此创建新的属性类型;从小事做起大事。将这些
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
然后


好主意,但这还不够完美。如果我使用的是与Kivy无关的第三方类呢?另外,我使用的是Kivy的
Vector
类,它不是以这种方式构建的(这就是我提出这个问题的原因)。@AvivCohn跟踪整个对象的变化是毫无意义的,因为它会增加很多不必要的计算,减慢应用程序的速度。我不知道通过跟踪外部类对象上的所有字段,您到底想做什么;但不管怎样,你可以把它包起来。这个主意不错,但还是不完美。如果我使用的是与Kivy无关的第三方类呢?另外,我使用的是Kivy的
Vector
类,它不是以这种方式构建的(这就是我提出这个问题的原因)。@AvivCohn跟踪整个对象的变化是毫无意义的,因为它会增加很多不必要的计算,减慢应用程序的速度。我不知道通过跟踪外部类对象上的所有字段,您到底想做什么;但无论如何,你可以把它包起来。