foccus a écrit 3 commentaires

  • # Encore un problème : Carbage collector me joue des tours

    Posté par  . En réponse au message Mon programme ne fonctionne pas comme je veux. Évalué à -1.

    En reprenant le programme ci-dessus, 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 :

    ``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):
    if not(20 < self.y < 310):
    self.dy=(-1)*self.dy
    if not(20 < self.x < 470):
    self.dx=(-1)*self.dx
    def demarrer():

    canvas.delete(ALL)
    EN=entree_N.get()
    N=int(EN)
    cx,cy,tdx,tdy,balle=[1]*N,[1]*N,[1]*N,[1]*N,[1]*N
    for l in range(N):
        cx[l],cy[l]=randint(30,420),randint(30,250)
        tdx[l],tdy[l]=4,4
    for i in range(N):
        balle[i]=canvas.create_oval(cx[i],cy[i],cx[i]+15,cy[i]+15,fill='white',outline='black')
    for i in range(N):
        p=bille()
        p.i=i
        p.x=cx[i]
        p.y=cy[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="yellow")
    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()`

    `

  • [^] # Re: Erreur d'indice ?

    Posté par  . En réponse au message Mon programme ne fonctionne pas comme je veux. Évalué à 2.

    Merci !

  • [^] # Re: Boucle infinie

    Posté par  . En réponse au message Mon programme ne fonctionne pas comme je veux. Évalué à 3.

    Pourtant ça fonctionne avec une seule bille. Il y a l'instruction tk.after qui rappelle la fonction deplace toutes les 20ms.