Bonjour,

J'ai écrit un programme Python de déplacement de billes dans un cadre avec rebondissement sur les bords du cadre. J’ai voulu placer le nombre de billes N en paramètre pouvant être modifié par l’utilisateur ( bouton Entry). Ca marche, sauf que lorsque l’utilisateur change la valeur de N, on obtient un message d’erreur :

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/init.py", line 1699, in __call_
return self.func(*args)
File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/init.py", line 745, in callit
func(*args)
File "/Users/foccus/Desktop/Python/Code2/tes1.py", line 13, in deplace
self.x=canvas.coords(balle[self.i])[2]
IndexError: list index out of range_


Le programme :

Code:
from tkinter import *
from random import *

class bille:
    def __init__(self):
        self.i=0
        self.x=0
        self.y=0
        self.dx=0
        self.dy=0
    def deplace(self,balle):
        canvas.move(balle[self.i],self.dx,self.dy)
        self.x=canvas.coords(balle[self.i])[2]
        self.y=canvas.coords(balle[self.i])[3]
        bille.mur(self)
        tk.after(20,bille.deplace,self,balle)

    def mur(self):
        i=self.i
        if not(20 < self.y < 310):
            self.dy=(-1)*self.dy
        if not(20 < self.x < 470):
            self.dx=(-1)*self.dx

def demarrer():
    global N,tx,ty,tdx,tdy,balle
    canvas.delete(ALL)
    EN=entree_N.get()
    N=int(EN)
    tx,ty,tdx,tdy,balle=[1]*N,[1]*N,[1]*N,[1]*N,[1]*N
    for l in range(N):
        tx[l],ty[l]=randint(30,420),randint(30,250)
        tdx[l],tdy[l]=4,4
    for i in range(N):
        balle[i]=canvas.create_oval(tx[i],ty[i],tx[i]+15,ty[i]+15,fill='red',outline='black')
    for i in range(N):
        p=bille()
        p.i=i
        p.x=tx[i]
        p.y=ty[i]
        p.dx=tdx[i]
        p.dy=tdy[i]
        p.deplace(balle)
    
#Programme Principal
tk=Tk()
canvas=Canvas(tk,width = 480, height = 320 , bd=0, bg="white")
canvas.pack()
#Creation d'un bouton "Démarrer"
Boutton_Demarrer=Button(tk,text="Démarrer",command=demarrer)
Boutton_Demarrer.pack(side=LEFT)
#Creation d'un bouton "Detruire":
Bouton_Detruire=Button(tk, text ='Quitter', command = tk.destroy)
#Ajouter l'affichage du bouton dans la fenêtre tk:
Bouton_Detruire.pack(side=RIGHT)


# Nombre de balles N
entree_N=Entry(tk,width=3)
entree_N.pack()

#Boucle principale:
tk.mainloop()