Не уверен, как Kivy использует ObjectProperty () и связывает его со свойством в файле .kv - PullRequest
0 голосов
/ 07 декабря 2018

Я хотел бы получить подробное объяснение того, как ObjectProperty (Нет) возвращает объект, связанный со свойствами, установленными в файле "pong.kv".

Что делает атрибут "id: pong_ball" в свойстве PongBall и что делает эта строка "ball: pong_ball"?

Я могу соединить большинство точек, но некоторые отсутствуют... Я был бы признателен за любое объяснение.Заранее спасибо !!!

pong.py (ниже ... Также ... Я знаю, что я загрязняю свое пространство имен)

from random import random
import kivy
kivy.require('1.9.1')
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.graphics import Color, Ellipse, Line
from kivy.vector import Vector
from kivy.properties import NumericProperty, ReferenceListProperty, \
    ObjectProperty
from random import randint
from kivy.clock import Clock

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 < 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
class PongBall(Widget):

    # velocity of the ball on x and y axes
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)

    # referencelist property so we can use ball.velocity as
    # a shorthand, just like e.g. w.pos for w.x and w.y
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    # ''move'' function will move the ball one step. This
    # will be called in equal intervals to animate the ball

    def move(self):
        self.pos = Vector(*self.velocity) + self.pos

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()

pong.kv (ниже)

#:kivy 1.9.1

<PongGame>:
    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

<PongBall>:
    size: 50, 50
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size
...