有没有办法在 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 没有改变。但我希望对 xy 的更改计为更改并引发事件。

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

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

但我还没有找到有关如何执行此操作的文档。帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您不需要为此创建新的属性类型;用小事打造大事。制作那些 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'

【讨论】:

不错的想法,但仍然不完美。如果我使用与 Kivy 无关的第三方类怎么办?另外,我正在使用 Kivy 的 Vector 类,它不是以这种方式构建的(这就是导致我提出这个问题的原因)。 @AvivCohn 跟踪 整个 对象的变化是没有意义的,因为它会添加大量不必要的计算,从而减慢您的应用程序。通过尝试跟踪外部类对象上的所有字段,我不知道您到底想做什么;但无论如何,你可以把它包起来。

以上是关于有没有办法在 Kivy 中创建自定义属性?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中创建自定义 JButton

如何在 grails 域中创建自定义查询

在 PySimpleGui 中创建自定义按钮

在 Visual Studio Code 中创建自定义语言

如何在 C# 中创建自定义属性

如何在 app.config 中创建自定义配置部分? [复制]