我刚开始学习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)
KivyProperty是一个类似于 Python 自己的便利类property,但也提供类型检查、验证和事件。ObjectProperty是该类的专门子类Property,因此它具有与其相同的初始化参数:
\n\n\n默认情况下,属性始终采用默认值[。]默认值必须是与属性类型一致的值。例如,您可以\xe2\x80\x99t 将列表设置为 StringProperty,因为 StringProperty\n 将检查默认值。
\n\nNone 是一种特殊情况:您可以将属性的默认值设置为 None,但随后可以将 None 设置为属性。如果您确实想要这样做,则必须使用 allowednone=True[.] 声明该属性。
\n
(来自基维Property documentation)
在您的代码中,PongGame有一个ball属性最初设置为None球对象,稍后将被分配给球对象。这是在 kv 文件中定义的:
<PongGame>:\n ball: pong_ball\n\n PongBall:\n id: pong_ball\n center: self.parent.center\nRun Code Online (Sandbox Code Playgroud)\n\n由于没有对象传递给初始化程序,因此任何对象都可以分配给该属性。您可以通过使用虚拟值初始化它来将其限制为仅容纳球对象:
\n\nball = ObjectProperty(PongBall())\nRun Code Online (Sandbox Code Playgroud)\n