Problème CANVAS

Fermé
Bertrand4304 Messages postés 5 Date d'inscription dimanche 5 juin 2022 Statut Membre Dernière intervention 21 février 2024 - Modifié le 25 août 2022 à 17:38
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 30 août 2022 à 10:27

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

A voir également:

6 réponses

yg_be Messages postés 23349 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 novembre 2024 Ambassadeur 1 554
25 août 2022 à 18:02

bonjour,

tu pourrais ajouter dans ta boucle:

    master.update()
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 25 août 2022 à 19:57

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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
26 août 2022 à 09:53

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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
27 août 2022 à 12:06

Bonjour,

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

0

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
yg_be Messages postés 23349 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 novembre 2024 1 554
Modifié le 28 août 2022 à 11:11

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
yg_be Messages postés 23349 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 novembre 2024 1 554
Modifié le 29 août 2022 à 22:13

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

0

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

Posez votre question
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
28 août 2022 à 15:38

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

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
30 août 2022 à 10:27

Bonjour Bertrand,

Alors, ca te va ou pas ?

0