2013-07-27 2 views
0

Попытка узнать, как использовать Kivy (ранее не программировал ничего, кроме школьной работы), и я столкнулся с небольшими проблемами.Классы не инициализируются должным образом в python

Мой код показан ниже.

Проблема заключается в моем классе 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() 
+0

Какая ошибка возникает из-за ошибки? Может быть, потому что ball.draw() не имеет холста? – Hyperboreus

ответ

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(...), б будет None, потому что ваша функция не возвращает значение.

2

Вы не определили класс Ball, вы определили функцию Ball.

Первая строка коды сам должен быть:

class Ball(Widget): 

(при условии, Болл наследует от виджета, как Bubble делает).

+0

oh wow, спасибо soo much. Не уверен, как я пропустил это через час, глядя на него. – user1011220

Смежные вопросы