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. Contributeur

    bonjour,

    tu pourrais ajouter dans ta boucle:

        master.update()
    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. Bonjour,

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

      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. Si seulement Bertrand4304 pouvait nous répondre ....

        0
        1. Bonjour Bertrand,

          Alors, ca te va ou pas ?

          0