6

我刚开始学习 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
4

1 回答 1

4

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

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

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

(来自基维Property documentation

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

<PongGame>:
    ball: pong_ball

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

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

ball = ObjectProperty(PongBall())
于 2013-09-03T06:46:56.017 回答