kivy oficial pong tutorial: el objeto ‘NoneType’ no tiene atributo ‘center’

Estoy tratando de aprender Kivy con este tutorial . He copiado el código después de “Aquí está el código completo para este paso:” a main.py y main.kv como se describe Cuando bash correr, me sale:

Traceback (most recent call last): File "main.py", line 47, in  PongApp().run() File "/home/kivy/code/kivy/kivy/app.py", line 527, in run root = self.build() File "main.py", line 41, in build game.serve_ball() File "main.py", line 23, in serve_ball self.ball.center = self.center AttributeError: 'NoneType' object has no attribute 'center' 

¿Qué estoy haciendo mal?

main.kv:

 #:kivy 1.0.9 : size: 50, 50 canvas: Ellipse: pos: self.pos size: self.size : ball: pong_ball canvas: Rectangle: pos: self.center_x-5, 0 size: 10, self.height Label: font_size: 70 center_x: root.width / 4 top: root.top - 50 text: "0" Label: font_size: 70 center_x: root.width * 3 / 4 top: root.top - 50 text: "0" PongBall: id: pong_ball center: self.parent.center 

main.py:

 from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import NumericProperty, ReferenceListProperty,\ ObjectProperty from kivy.vector import Vector from kivy.clock import Clock from random import randint class PongBall(Widget): velocity_x = NumericProperty(0) velocity_y = NumericProperty(0) velocity = ReferenceListProperty(velocity_x, velocity_y) def move(self): self.pos = Vector(*self.velocity) + self.pos class PongGame(Widget): ball = ObjectProperty(None) def serve_ball(self): self.ball.center = self.center self.ball.velocity = Vector(4, 0).rotate(randint(0, 360)) def update(self, dt): self.ball.move() #bounce off top and bottom if (self.ball.y  self.height): self.ball.velocity_y *= -1 #bounce off left and right if (self.ball.x  self.width): self.ball.velocity_x *= -1 class PongApp(App): def build(self): game = PongGame() game.serve_ball() Clock.schedule_interval(game.update, 1.0 / 60.0) return game if __name__ == '__main__': PongApp().run() 

Tienes el nombre equivocado para tu archivo KV. Debe ser “pong.kv”. Si el nombre del archivo KV coincide con el nombre de su aplicación (menos la aplicación), entonces se utilizará automáticamente.

Nombró su archivo KV “main.kv” que no coincide con el nombre de su aplicación “PongApp”, por lo que la magia no sucedió. Pudiste cargar manualmente el archivo KV usando Builder.load_file (). Si miras hacia atrás en el tutorial, puedes ver que debes nombrar el archivo KV como “pong.kv”.

he añadido

 from kivy.lang import Builder Builder.load_file('main.kv') 

a mi main.py y funciona perfectamente. Por qué “main.kv” no se detectó automáticamente sigue siendo un misterio para mí.

self.ball se está inicializando con:

 ball = ObjectProperty(None) 

Esto le da un valor predeterminado de None . Por lo tanto, cuando intenta acceder a self.ball.center falla.

El tutorial contiene un paso que probablemente te perdiste:

No te olvides de conectarlo al archivo kv, asignando un ID al widget hijo y configurando la propiedad de objetos de la bola de PongGame a ese ID