ObjectProperty 类的使用

Posted

技术标签:

【中文标题】ObjectProperty 类的使用【英文标题】:Usage of ObjectProperty class 【发布时间】:2013-09-06 00:14:17 【问题描述】:

我刚开始学习 kivy,我对 ObjectProperty 类的用法以及它如何将 None 作为参数感到非常困惑。有人可以解释一下吗?我在 kivy 教程中找到的:

class PongGame(Widget):
    ball = ObjectProperty(None)

    def update(self, dt):
        self.ball.move()

        # bounce off top and bottom
        if (self.ball.y < 0) or (self.ball.top > self.height):
            self.ball.velocity_y *= -1

        # bounce off left and right
        if (self.ball.x < 0) or (self.ball.right > self.width):
            self.ball.velocity_x *= -1

【问题讨论】:

请添加一个您觉得混淆的代码示例。 【参考方案1】:

Kivy Property 是一个类似于 Python 自己的 property 的便利类,但它也提供类型检查、验证和事件。 ObjectPropertyProperty 类的一个特殊子类,因此它具有与它相同的初始化参数:

默认情况下,属性始终采用默认值[.] 默认值 value 必须是与 Property 类型一致的值。例如, 您不能将列表设置为 StringProperty,因为 StringProperty 将检查默认值。

None 是一种特殊情况:您可以将 Property 的默认值设置为 无,但您不能在之后将 None 设置为属性。如果你真的 想要这样做,您必须使用 allownone=True[.]

声明该属性

(来自基维Property documentation

在您的代码中,PongGame 有一个 ball 属性,该属性最初设置为 None,稍后将分配一个球对象。这是在 kv 文件中定义的:

<PongGame>:
    ball: pong_ball

    PongBall:
        id: pong_ball
        center: self.parent.center

因为没有对象被传递给初始化器,所以 任何 对象都可以分配给该属性。您可以通过使用虚拟值对其进行初始化来将其限制为仅容纳球对象:

ball = ObjectProperty(PongBall())

【讨论】:

虽然这是一个很好的解释,但我认为最后一点是不正确的,虽然这会以 PongBall 的实例开始,但您仍然可以随意放置任何您想要的东西,因此没有限制,还有一个额外的问题,因为最初传递的值(“虚拟”值)将在所有实例之间共享,这可能会产生错误(例如,如果它是一个小部件,并且您尝试将它添加到您的小部件中,一旦你实例化两次,它就会崩溃,因为一个小部件只能有一个父级)。

以上是关于ObjectProperty 类的使用的主要内容,如果未能解决你的问题,请参考以下文章

Kivy ObjectProperty 更新标签文本

SQL server基础objectproperty()函数

$this->_objectProperty 中的下划线是啥意思? [复制]

Python Kivy 错误:“kivy.properties.ObjectProperty”对象没有属性文本

Kivy & pyvisa - 如何在 GPIB 连接后将 ObjectProperty 设置为 None?

如何将 ColorPicker 值属性绑定到 ScalaFX 中的 ScalaFX ObjectProperty?