web-dev-qa-db-fra.com

TypeError: l'objet 'NoneType' n'a pas d'attribut '__getitem__'

J'ai un problème et je n'ai aucune idée pourquoi cela se produit et comment y remédier. Je travaille sur le développement d'un jeu vidéo avec python et pygame et j'obtiens cette erreur:

 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__'

Le code:

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]

Pouvez-vous m'expliquer ce que signifie cette erreur et pourquoi elle se produit pour que je puisse la corriger?

23
user1908896

BrenBarn a raison. L'erreur signifie que vous avez essayé de faire quelque chose comme None[5]. Dans le backtrace, il est écrit self.imageDef=self.values[2], ce qui signifie que votre self.values est None.

Vous devez parcourir toutes les fonctions qui mettent à jour self.values et assurez-vous de prendre en compte tous les cas d'angle.

24
user1902824

move.CompleteMove() ne renvoie pas de valeur (peut-être qu'il imprime juste quelque chose). Toute méthode qui ne renvoie pas de valeur renvoie None et vous avez affecté None à self.values.

En voici un exemple:

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

Vous remarquerez que y n'imprime rien, car son None (la seule valeur qui n'imprime rien sur l'invite interactive).

6
Burhan Khalid

La fonction move.CompleteMove(events) que vous utilisez dans votre classe ne contient probablement pas d'instruction return. Donc, rien n'est retourné à self.values (==> Aucun). Utilisez return dans move.CompleteMove(events) pour retourner tout ce que vous voulez stocker dans self.values Et cela devrait fonctionner. J'espère que cela t'aides.

1
mlcr