Comment ignorer une erreur en python

Bambi - 15 nov. 2022 à 20:33
Gandalfix Messages postés 79 Date d'inscription vendredi 12 juin 2020 Statut Non membre Dernière intervention 6 avril 2024 - 16 nov. 2022 à 06:21

Bonjour, je débute en python et j'ai fait aujourd'hui "the game of life" en python avec Tkinter.

Seulement dans la fonction start() je souhaiterais lorsqu'il y a l'erreur "IndexError: list index out of range" passer directement à la suite.

Comme ça si la case n'existe pas c'est comme si la cellule était morte (les noires sont mortes).

Voici mon code:

​
from tkinter import*
from random import*

def start():
    global x
    global y
    global cellules
    global testeur
    x=5
    y=5
    for i in range(400):
        testeur=0
        if cases[i-21]==1:
            testeur+=1
        if cases[i-1]==1:
            testeur+=1
        if cases[i-20]==1:
            testeur+=1
        if cases[i+20]==1:
            testeur+=1
        if cases[i+21]==1:
            testeur+=1
        if cases[i+1]==1:
            testeur+=1
        if cases[i+19]==1:
            testeur+=1
        if cases[i-19]==1:
            testeur+=1


        if testeur==2:
            pass
        elif testeur==3:
            cases[i]=1
        elif testeur<2 or testeur>3:
            cases[i]==0



        x+=10
        if x==205:
            y+=10
            x=5

    draw_map()
        


def draw_map():
    global x
    global y
    global cellules
    global generation
    x=5
    y=5
    for i in range(400):
        if cases[i]==0:
            rect = cadre.create_rectangle(x+1,y+1,x+8,y+8,width=0,fill="black")
        else:
            rect = cadre.create_rectangle(x+1,y+1,x+8,y+8,width=0,fill="white")
            cellules+=1
        x+=10
        if x==205:
            y+=10
            x=5
    generation+=1
    
#Init
x=5
y=5
cellules=0
generations=0
testeur=0
cases=[]
for i in range(400):
    cases.append(randint(0,1))

#Fen
fen = Tk()
fen.title("Game of life")
cadre = Canvas(fen, bg="dark gray", height=204,width=204)
draw_map()
cadre.pack(side=LEFT)
    
Text1 = Label(fen, text="Nombre de cellules:").pack()
Text2 = Label(fen, text=cellules).pack()
Text3 = Label(fen, text="Nombre de générations:").pack()
Text4 = Label(fen, text=generations).pack()
Start = Button(fen, text="Start", command=start).pack(side=BOTTOM)


fen.mainloop()

​

Voici ce que renvoie le code: 

Quand je clique sur start je suis sensé passer à la génération suivante.

Savez vous comment faire ?

1 réponse

Gandalfix Messages postés 79 Date d'inscription vendredi 12 juin 2020 Statut Non membre Dernière intervention 6 avril 2024 7
16 nov. 2022 à 06:21

Bonjour,

2 Solutions :

• Solution 1 : Dans la fonction start, imbriquer 2 if à chaque fois pour rester dans les index de la liste cases (de 0 à 399). Exemple :

def start ():
	global x
	global y
	global cellules
	global testeur
	x = 5
	y = 5
	for i in range (400):
		testeur = 0
		if (i - 21) >= 0 :
			if cases [i - 21] == 1 :
				testeur += 1
		if (i + 21) <= 399 :
			if cases [i + 21] == 1 :
				testeur += 1

• Solution 2 : Passer à chaque fois par un try / except. Exemple :

def start ():
	global x
	global y
	global cellules
	global testeur
	x = 5
	y = 5
	for i in range (400):
		testeur = 0
		try :
			if cases [i - 21] == 1 :
				testeur += 1
		except :
			return
		
		try :
			if cases [i + 21] == 1 :
				testeur += 1
		except :
			return
​

0
Rejoignez-nous