Attribut erreur: cet Objet n'a pas d'attribut Python
Je suis en train de programmer une version de conway du jeu de la vie, cependant, je reçois le message 'Cell' Object Has no attribute 'nextState'
quand il semble comme il se doit déclarer la valeur de nextState avant de demander de référence. voici mon code:
from tkinter import *
root = Tk()
class Cell (Button):
Dead = 0
Live = 1
def __init__ (self,parent):
Button.__init__(self,parent, relief = "raised" , width = 2 , borderwidth = 1 , command = self.onpress)
self.displayState(Cell.Dead)
def onpress (self):
if self.state == Cell.Live:
self.displayState(Cell.Dead)
elif self.state == Cell.Dead:
self.displayState(Cell.Live)
def setNextState (self , Neighbours):
if self.state == Cell.Live and (Neighbours < 2 or Neighbours > 3):
self.nextState = Cell.Dead
elif self.state == Cell.Dead and Neighbours == 3:
self.nextState = Cell.Live
elif self.state == Cell.Dead and Neighbours != 3:
self.nextState = self.state
def stepToNextState(self):
self.displayState(self.nextState)
def displayState (self , newstate):
self.state = newstate
if self.state == Cell.Live:
self["bg"] = "black"
if self.state == Cell.Dead:
self["bg"] = "white"
class Grid:
def __init__(self,parent,sizex,sizey):
self.sizex = sizex
self.sizey = sizey
self.cells = []
for a in range (0,self.sizex):
rowcells = []
for b in range (0, self.sizey):
c = Cell(parent)
c.grid(row=b , column=a)
rowcells.append(c)
self.cells.append(rowcells)
def step (self):
cells = self.cells
for x in range (0,self.sizex):
if x==0: x_down = self.sizex-1
else: x_down = x-1
if x==self.sizex-1: x_up = 0
else: x_up = x+1
for y in range(0,self.sizey):
if y==0: y_down = self.sizey-1
else: Y_down = y-1
if y==self.sizey-1: y_up = 0
else: y_up = y+1
sum = cells[x_down][y].state + cells[x_up][y].state + cells[x][y_down].state + cells[x][y_up].state + cells[x_down][y_down].state +cells[x_up][y_up].state + cells[x_down][y_up].state + cells[x_up][y_down].state
cells[x][y].setNextState(sum)
for row in cells:
for cell in row:
cell.stepToNextState()
def clear(self):
for row in self.cells:
for cell in row:
cell.displayState(Cell.Dead)
if __name__ == "__main__":
frame = Frame(root)
frame.pack()
grid = Grid(frame,25,25)
bottomFrame = Frame(root)
bottomFrame.pack (side = BOTTOM)
buttonStep = Button(bottomFrame , text="Step" , command=grid.step)
buttonStep.pack(side = LEFT)
buttonClear = Button(bottomFrame, text = "Clear", command=grid.clear)
buttonClear.pack(side=LEFT , after=buttonStep)
root.mainloop()
Le message d'erreur est:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
return self.func(*args)
File "C:\Users\Owner\Desktop\Other\Programs & Misc\Python\Tyler's Game of Life.py", line 65, in step
cell.stepToNextState()
File "C:\Users\Owner\Desktop\Other\Programs & Misc\Python\Tyler's Game of Life.py", line 27, in stepToNextState
self.displayState(self.nextState)
AttributeError: 'Cell' object has no attribute 'nextState'
Si quelqu'un pouvait point où l'erreur se produit /quelle est l'origine et, éventuellement, un moyen pour résoudre ce problème, je vous serais très reconnaissant.
On dirait que vous avez beaucoup d'indentation problèmes, et d'indentation est critique en Python. Est-ce juste une erreur dans la copie?
J'en retrait à votre question & si après cela fonctionnait bien...
Si son problème est avec l'indentation, ne pas le corriger en question-poster une réponse.
Je viens de retrait de la question pour d'autres personnes à comprendre & aider à résoudre le problème,après que je l'ai couru & voila...ne savait pas que c'était la seule question
C'était le point de ma question dans le premier commentaire. Il est important de savoir si son code est indenté correctement ou pas. Dans le cas de Python, l'indentation n'est pas seulement un problème de lisibilité, il détermine si le code est correct ou pas.
J'en retrait à votre question & si après cela fonctionnait bien...
Si son problème est avec l'indentation, ne pas le corriger en question-poster une réponse.
Je viens de retrait de la question pour d'autres personnes à comprendre & aider à résoudre le problème,après que je l'ai couru & voila...ne savait pas que c'était la seule question
C'était le point de ma question dans le premier commentaire. Il est important de savoir si son code est indenté correctement ou pas. Dans le cas de Python, l'indentation n'est pas seulement un problème de lisibilité, il détermine si le code est correct ou pas.
OriginalL'auteur Chubzorz | 2014-04-03
Vous devez vous connecter pour publier un commentaire.
Le problème semble être que votre
for row in cells
boucle est à l'intérieur de votre précédentefor x in range(0, self.sizex)
boucle. Voici ce que lestep
méthode doit regarder comme si vous l'obtenez correctement en retrait:Si tous l'indentation des problèmes sont pris en charge (ou n'étaient pas dans le code d'origine), il y a toujours un problème qui peut cause d'un problème dans certaines situations. Le problème est que le
Cell.setNextState
méthode n'est pas la poignée de chaque situation. Plus précisément, il ne définit pasnextState
si une cellule est vivante et doit rester de la sorte (il a deux ou trois vivant voisins). L'absence d'unelse
sur votre chaîne deif
etelif
états devraient avoir soulevé ce qu'un drapeau rouge pour moi, mais j'ai oublié la première fois que j'ai examiné la fonction.Voici comment il peut être fixé:
'Cell" object has no attribute 'nextState'
.J'ai trouvé la question qui reste en suspens et édité ma réponse.
OriginalL'auteur Blckknght