2017-08-27 9 views
1

my_listの各項目に対してdrawmoveメソッドを呼び出すとします。私はi.draw()i.move()の代わりにmy_objects.draw()my_objects.move()を試しましたが、私はいつも同じエラーが発生します。ここに私のコードは次のとおりです。ここでPython - Pygame AttributeError:intオブジェクトに属性 'draw'がありません

import pygame 
import random 

BLACK = (0, 0, 0) 
GREEN = (0, 255, 0) 

class Rectangle(): 
    def __init__(self): 
     self.x = random.randrange(0, 700) 
     self.y = random.randrange(0, 500) 
     self.height = random.randrange(20, 70) 
     self.width = random.randrange(20, 70) 
     self.change_x = random.randrange(-3, 3) 
     self.change_y = random.randrange(-3, 3) 

    def move(self): 
     self.x += self.change_x 
     self.y += self.change_y 

    def draw(self): 
     pygame.draw.rect(screen, GREEN, [self.x, self.y, self.width, self.height]) 

my_list = [] 

for number in range(10): 
    my_object = Rectangle() 
    my_list.append(my_object) 

pygame.init() 

screen = pygame.display.set_mode((700, 500)) 
done = False 
clock = pygame.time.Clock() 

while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

    screen.fill(BLACK) 

    for i in range(len(my_list)): 
     number.draw() 
     number.move() 

    pygame.display.flip() 
    clock.tick(60) 

pygame.quit() 

は誤りです:

Traceback (most recent call last): 
    line 53, in <module> 
    number.draw() 
AttributeError: 'int' object has no attribute 'draw' 
+0

してください私はそれが働いていた、 'あなたが行うときnumber'がrange'に番号に対して'作成され、数が – Y0da

答えて

1

あなたは、インデックスを反復処理しています。しかし、本当にアイテムを繰り返し処理したいと思っています。だから、range(len(...))の建設は必要ありません。代わりにfor item in itemsを使用してください。あなたのインデントをチェック

for rect in my_list: 
    rect.draw() 
    rect.move() 
+0

ありがとうこれを行うことによって、int型であるとして、これはエラーを説明しているようです:これを試してみてください!つまり、範囲(len(my_list))は必要ありませんでしたか? @Miray、右。 – Miray

+0

'range(len(my_list))'は0から9の範囲の数値を作り、 'i'はそれらの値を受け取ります。 –

+0

@Miray 'range'を反復すると、それが与える要素はその範囲の数値になり、数値には描画メソッドがありません。 'my_list'自体を繰り返し処理すれば、' my_list'の各要素を取得します。おそらくdrawメソッドがあります。 – Carcigenicate

関連する問題