Problème CANVAS

Bertrand4304 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -

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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    tu pourrais ajouter dans ta boucle:

        master.update()
    0
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
       

      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
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bonjour,

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

    0
  4. regglyss
     

    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

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

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

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

    0
  7. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bonjour Bertrand,

    Alors, ca te va ou pas ?

    0