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跟踪整个对象的变化是毫无意义的,因为它会增加很多不必要的计算,减慢应用程序的速度。我不知道通过跟踪外部类对象上的所有字段,您到底想做什么;但无论如何,你可以把它包起来。