ObjectProperty类的用法

use*_*406 5 python kivy

我刚开始学习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
Run Code Online (Sandbox Code Playgroud)

Mat*_*vor 5

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

\n\n
\n

默认情况下,属性始终采用默认值[。]默认值必须是与属性类型一致的值。例如,您可以\xe2\x80\x99t 将列表设置为 StringProperty,因为 StringProperty\n 将检查默认值。

\n\n

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

\n
\n\n

(来自基维Property documentation)

\n\n

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

\n\n
<PongGame>:\n    ball: pong_ball\n\n    PongBall:\n        id: pong_ball\n        center: self.parent.center\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
ball = ObjectProperty(PongBall())\n
Run Code Online (Sandbox Code Playgroud)\n

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