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

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

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

  2. Bonjour,

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

    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()
      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()
        
    2. Contributeur

      bonjour,

      tu pourrais ajouter dans ta boucle:

          master.update()