0

Kivy の使い方を学ぼうとしていて (学業以外はプログラミングしたことがありません)、ちょっとしたトラブルに遭遇しています。

私のコードを以下に示します。

問題は、アプリの開始時に Ball クラスにあり、BubblePop.SetupLevel()ボールは Ball クラスのインスタンスで満たされる必要があります。しかし、どういうわけかそれは機能していません。が呼び出されると、行BobblePop.update()にエラーが表示されますball.draw()

AttributeError: 'NoneType' object has no attribute 'draw'


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 kivy.lang import Builder
from kivy.graphics import Color, Ellipse
from random import random, randint
from kivy.core import window
#balls are what bounce around the screen. They turn into bubbles upon 
#colliding with a bubble.

def Ball(width,height):
    def __init__(self,width,height):
        self.x = randint(0,width)
        self.y = randint(0,height)
        self.colorRGB = [0,0,0]
        self.velX = 0
        self.velY = 0
        self.ball_size = 20

    def draw(self):
        Ellipse(pos=(self.x,self.y), size = (self.ball_size,self.ball_size))


class Bubble(Widget):
    pass

class BubblePop(Widget):
    balls = []
    bubbles = []

    def SetupLevel(self,numballs):
        for x in xrange(numballs):
            ball = Ball(self.height,self.width)
            self.balls.append(ball)

    def on_touch_down(self,touch):
        with self.canvas:
            r = random()
            g = random()
            b = random()
            Color(r,g,b)
            d = 80.
            self.bubbles.append([touch.x - d / 2,touch.y - d / 2,[r,g,b]])
            Ellipse(pos=(self.bubbles[-1][0], self.bubbles[-1][1]), size=(d, d))


    def update(self,dt):
        with self.canvas:
            self.canvas.clear()
            for ball in self.balls:
                ball.draw()

class BubbleApp(App):
    def build(self):
        game = BubblePop()
        game.SetupLevel(10)
        Clock.schedule_interval(game.update, 1.0/60.0)
        return game


if __name__ == '__main__':
    BubbleApp().run()
4

2 に答える 2

2

あなたのボールの「クラス」は奇妙に見えます。あなたが定義した方法は、クラスではなく関数です。あなたが持っている

def Ball(width,height):
    def __init__(self,width,height):
        self.x = randint(0,width)
        self.y = randint(0,height)
        self.colorRGB = [0,0,0]
        self.velX = 0
        self.velY = 0
        self.ball_size = 20

次のようなものが必要だと思う場所

class Ball():
    def __init__(self, width, height):
        ...

これで、関数が値を返さないため、を呼び出すたびb = Ball(...)に b になります。None

于 2013-07-27T19:52:45.097 に答える
2

Ball クラスを定義していません。Ball という関数を定義しています。

コード自体の最初の行は次のようになります。

class Ball(Widget):

(Ball が Bubble のように Widget を継承すると仮定します)。

于 2013-07-27T19:52:54.333 に答える