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()
-----