有没有办法在 Kivy 中创建自定义属性?
Posted
技术标签:
【中文标题】有没有办法在 Kivy 中创建自定义属性?【英文标题】:Is there a way to create custom properties in Kivy? 【发布时间】:2016-08-25 02:48:32 【问题描述】:有时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
。
但我还没有找到有关如何执行此操作的文档。帮助将不胜感激。
【问题讨论】:
【参考方案1】:您不需要为此创建新的属性类型;用小事打造大事。制作那些 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'
【讨论】:
不错的想法,但仍然不完美。如果我使用与 Kivy 无关的第三方类怎么办?另外,我正在使用 Kivy 的Vector
类,它不是以这种方式构建的(这就是导致我提出这个问题的原因)。
@AvivCohn 跟踪 整个 对象的变化是没有意义的,因为它会添加大量不必要的计算,从而减慢您的应用程序。通过尝试跟踪外部类对象上的所有字段,我不知道您到底想做什么;但无论如何,你可以把它包起来。以上是关于有没有办法在 Kivy 中创建自定义属性?的主要内容,如果未能解决你的问题,请参考以下文章