【问题标题】:Is there a way to create custom properties in Kivy?有没有办法在 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

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

【问题讨论】:

    标签: python user-interface events kivy subclassing


    【解决方案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 跟踪 整个 对象的变化是没有意义的,因为它会添加大量不必要的计算,从而减慢您的应用程序。通过尝试跟踪外部类对象上的所有字段,我不知道您到底想做什么;但无论如何,你可以把它包起来。
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2010-10-23
    • 2019-08-22
    • 2011-04-10
    • 2021-12-14
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多