Problème CANVAS

Bonjour à tous

Ci-joint un petit script dans lequel je souhaite afficher les rectangles à chaque création et non globalement. Qu'y a-t-il à corriger?

Merci d'avance pour vos conseils.

Cordialement

Bertrand

Nom supprimé Modération CCM

from  tkinter  import * 
import os,sys,time
########################################################################################################
def ECRAN_BLANC():
   w_col   = "white"   ;    w_cote  = 1500   ;   xx      = 20   ;   yy      = 20
   canevas1.create_rectangle(xx,yy,xx+w_cote,yy+800,fill=w_col,outline = w_col)    # dessin écran blanc
def EVOL(x,y):   
   xx    =  x        ;    yy    =  y     ;   w_col = "black";   w_cote  = 10
   canevas1.create_rectangle(xx,yy,xx+w_cote,yy+w_cote,fill=w_col,outline = w_col) # dessin cellules en boucle
   time.sleep(1)
   return(x,y)
########################################################################################################
master       = Tk()
master.state   ("zoomed")
master.title("Que faut-il faire pour voir l'évolution des cellules et non l'affichage final ?")                  
canevas1     =    Canvas(master)
canevas1.pack(fill=BOTH, expand=True)
########################################################################################################
ECRAN_BLANC()
x = 70
y = 70
ind=1
while ind <10:
   x,y=EVOL(x,y)
   x+=20
   y+= 30
   ind+=1
master.mainloop()


Windows / Firefox 104.0

6 réponses

  1. Bonjour Bertrand,

    Alors, ca te va ou pas ?

    0
    1. Si seulement Bertrand4304 pouvait nous répondre ....

      0
      1. Bonjour, ce n'est pas comme cela que l'on procède avec tkinter. Cette bibliothèque fournit une méthode pour faire cela: after.

        En conséquence, il ne faut pas utiliser de time.sleep mais bien cette méthode after.

        On transforme donc la fonction EVOL:

        def evol(x, y, i=0, maxi=10):
           w_col = "black"
           w_cote  = 10
           canevas1.create_rectangle(x, y ,x + w_cote, y + w_cote, fill=w_col, outline=w_col) # dessin cellules
           if i < maxi:
                canevas1.after(1000, evol, x + 20, y + 30, i + 1, maxi)

        Puis on supprime cette horrible boucle while et on appelle alors cette fonction.

        # Code
        
        ECRAN_BLANC()
        
        x = 70
        y = 70
        evol(x, y)
        
        master.mainloop()

        Et voilà, bonne continuation.

        0
        1. Contributeur

          Inutile d'avoir i et maxi:

          def evol(x, y, n=8):
             w_col = "black"
             w_cote  = 10
             canevas1.create_rectangle(x, y ,x + w_cote, y + w_cote, fill=w_col, outline=w_col) # dessin cellules
             if n > 0:
                  canevas1.after(1000, evol, x + 20, y + 30, n-1)
          0
        2. Contributeur

          Merci regglyss de m'avoir fait découvrir after()!

          0
      2. Bonjour,

        Si ton problème est résolu, tu peux le marquer "Résolu" ...

        0
        1. Bonjour,

          Et tu peux enlever ceci:

          return(x,y)

          et écrire simplement:

          EVOL(x,y)

          car x et y ne sont pas modifiés dans la fonction, ca donnerait ça:

          from  tkinter  import * 
          import os,sys,time
          
          def evolution(x,y):   
             w_col = "black"; w_cote = 10
             canevas1.create_rectangle(x,y,x+w_cote,y+w_cote,fill = w_col,outline = w_col)
             time.sleep(1)
          
          master = Tk()
          master.title("test")
          master.state("zoomed")
          
          canevas1 = Canvas(master)
          canevas1.pack(fill=BOTH, expand=True)
          
          w_col = "white"; w_cote = 1500; xx = 20; yy = 20
          canevas1.create_rectangle(xx,yy,xx+w_cote,yy+800,fill=w_col,outline = w_col)
          
          x,y = 70, 70
          ind=0
          
          while ind <10:
             evolution(x,y)
             x+=20
             y+= 30
             ind+=1
             master.update()
          
          master.mainloop()
          0
          1. on peut même simplifier encore en supprimant la variable ind:

            x,y = 70, 70
            
            for k in range(10):
               evolution(x,y)
               x+=20
               y+= 30
               master.update()
            
            0
        2. Contributeur

          bonjour,

          tu pourrais ajouter dans ta boucle:

              master.update()
          0