2012-12-17 46 views
14

Mam problem i nie mam pojęcia, dlaczego tak się dzieje i jak to naprawić. Pracuję nad opracowaniem Videogame z Python i pygame i dostaję ten błąd:TypeError: Obiekt "NoneType" nie ma atrybutu "__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__' 

Kod:

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] 

Czy możesz mi wyjaśnić co to oznacza błąd i dlatego jest dzieje się, więc mogę to naprawić?

+7

W pewien sposób 'self.values' jest ustawione na Brak. Co ma zrobić 'move.CompleteMove'? Jaką wartość zwraca? – BrenBarn

+1

Należy również zauważyć, że każda funkcja, która nie posiada instrukcji return, zwróci wartość "None", dlatego należy dokładnie sprawdzić, czy nie występuje w tym przypadku. – DaveP

Odpowiedz

19

BrenBarn jest poprawny. Błąd oznacza, że ​​próbowałeś zrobić coś takiego, jak None[5]. W śladzie zwrotnym jest napisane self.imageDef=self.values[2], co oznacza, że ​​Twój self.values to None.

Powinieneś przejrzeć wszystkie funkcje, które aktualizują self.values i upewnij się, że uwzględniasz wszystkie narożniki.

+1

Dziękuję wszystkim, którzy mi pomogli, że mogłem naprawić ten problem, na oświadczeniu zwrotnym wystąpił błąd wcięcia, więc wracał Brak lol – user1908896

1

Funkcja move.CompleteMove(events) używana w klasie prawdopodobnie nie zawiera instrukcji return. Dlatego nic nie jest zwracane do self.values (==> Brak). Użyj return w move.CompleteMove(events), aby zwrócić wszystko, co chcesz zapisać w self.values i powinno działać. Mam nadzieję że to pomoże.

4

move.CompleteMove() nie zwraca wartości (może po prostu drukuje coś). Każda metoda, która nie zwraca wartości, zwraca None, a Ty przypisałeś None do self.values.

Oto przykład tego:

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

Zauważysz y nic nie drukuje, ponieważ jego None (jedyna wartość, która nie drukuje niczego na interaktywnej wierszu).

Powiązane problemy