2012-12-17 41 views
14

Tôi gặp sự cố và tôi không biết tại sao điều này xảy ra và cách khắc phục. Tôi đang làm việc trên đang phát triển một trò chơi điện tử với trăn và pygame và tôi nhận được lỗi này:TypeError: đối tượng 'NoneType' không có thuộc tính '__getitem__'

File "/home/matt/Smoking-Games/sg-project00/project00/GameModel.py", line 15, in Update 
    self.imageDef=self.values[2] 
TypeError: 'NoneType' object has no attribute '__getitem__' 

Mã:

import pygame,components 
from pygame.locals import * 

class Player(components.Entity): 

    def __init__(self,images): 
     components.Entity.__init__(self,images) 
     self.values=[] 

    def Update(self,events,background): 
     move=components.MoveFunctions() 
     self.values=move.CompleteMove(events) 
     self.imageDef=self.values[2] 
     self.isMoving=self.values[3] 

    def Animation(self,time): 
     if(self.isMoving and time==1): 
      self.pos+=1 
      if (self.pos>(len(self.anim[self.imageDef])-1)): 
       self.pos=0 
     self.image=self.anim[self.imageDef][self.pos] 

Bạn có thể giải thích cho tôi điều đó có nghĩa lỗi và tại sao nó lại xảy ra để tôi có thể sửa nó?

+7

Bằng cách nào đó 'self.values' được đặt thành Không. 'Move.CompleteMove' là gì? Giá trị của nó là gì? – BrenBarn

+1

Cũng lưu ý rằng bất kỳ hàm nào không có câu lệnh return sẽ trả về 'None', vì vậy hãy kiểm tra kỹ trường hợp này. – DaveP

Trả lời

19

BrenBarn là chính xác. Lỗi có nghĩa là bạn đã cố gắng thực hiện một cái gì đó như None[5]. Trong backtrace, nó nói self.imageDef=self.values[2], có nghĩa là self.values của bạn là None.

Bạn nên thực hiện tất cả các chức năng cập nhật self.values và đảm bảo bạn chiếm tất cả các trường hợp góc.

+1

Nhờ tất cả mọi người đã giúp tôi tôi có thể khắc phục vấn đề này, đã có một lỗi thụt đầu dòng trên báo cáo trả lại vì vậy nó đã trở về Không có lol – user1908896

1

Chức năng move.CompleteMove(events) mà bạn sử dụng trong lớp học của mình có thể không chứa tuyên bố return. Vì vậy, không có gì được trả về self.values (==> Không). Sử dụng return trong move.CompleteMove(events) để trả lại bất kỳ thứ gì bạn muốn lưu trữ trong self.values và nó sẽ hoạt động. Hi vọng điêu nay co ich.

4

move.CompleteMove() không trả lại giá trị (có thể nó chỉ in một cái gì đó). Bất kỳ phương thức nào không trả về giá trị trả về None và bạn đã chỉ định None đến self.values.

Dưới đây là một ví dụ về điều này:

>>> def hello(x): 
... print x*2 
... 
>>> hello('world') 
worldworld 
>>> y = hello('world') 
worldworld 
>>> y 
>>> 

Bạn sẽ lưu ý y không in bất cứ điều gì, bởi vì None (giá trị duy nhất mà không in bất cứ điều gì trên dấu nhắc tương tác) của nó.

Các vấn đề liên quan