Informatique et sciences du numérique Lycée Pierre Émile Martin L – Gestion du temps Créer une animation ( balle qui rebondie, personnage qui avance, projectiles qui tombent) nécessite une boucle « répéter , à intervalle de temps régulier ». Pour cela deux outils sont utiles sous Python. A partir du module time. Il contient deux fonctions essentielles sleep( t ) : Effectue une pause de t secondes. Mais tout le programme est en pause ! time() : Renvoie l'heure POSIX. C'est à dire le nombre de secondes écoulées depuis le 1 er Janvier 1970. Peu pratique pour avoir la date, mais permet de mesurer des intervalles de temps. Pour plus de clarté Tester en Console Python ( fenêtre du bas dans Edupython), les instructions suivantes. >>> from time import* >>> time() >>> sleep(10) >>> debut=time() >>> fin=time() >>> print(round(fin – debut)) Ex L1 : Minuteur Écrire un petit programme qui affiche un compte à rebours de 5s comme ci-contre. A partir du module tkinter La méthode 'after' permet de déclencher une fonction après un délai précisé en millisecondes. En voici la syntaxe : fenetre.after ( delai, fonction) Attention : la fonction à appeler s'écrit sans paramètres ni parenthèse, comme pour l'option command d'un bouton. Ex L2 : Bouton Minuteur Voici par exemple un programme affichant un compteur à partir de 0 secondes puis augmentant indéfiniment. Le transformer en minuteur comme le précédent : à partir de 10 s jusqu'à 0. def chrono(): # on arrive ici toutes les 1000 ms global actu Minuteur.config(text='Debut depuis '+str(actu)+' s' ) actu=actu+1 fen.after(1000,chrono) ##################################### from tkinter import * from time import * fen = Tk() fen.title("minuteur") actu=0 Minuteur=Label(fen,text="Debut depuis 0 s") Minuteur.pack() chrono() fen.mainloop() Supplément pour les rapides : Faites un jeu où vous avez 10s pour désamorcer une bombe en cliquant sur un bouton Informatique et sciences du numérique Lycée Pierre Émile Martin La méthode 'move() ' prend pour arguments : l'item à bouger, le déplacement horizontal ( positif =vers la droite) et vertical (négatif = vers le haut). Ex L3 : Diagonales a) Expérimentez le code suivant qui crée un triangle et le fait bouger à travers l’écran from Tkinter import * import time fen = Tk() fond =.Canvas(fen, width=500, height=500) fond.pack() bouton_sortir = Button(fen, text="Sortir", command=fen.destroy).pack() forme=fond.create_polygon(10, 10, 10, 60, 50, 35) for x in range(0, 100): fond.move(forme, 5, 0) fen.update() time.sleep(0.05) fen.mainloop() L'instruction fen.update() force l’objet fen à se mettre à jour. (Sinon le triangle ne bougerai qu'à la fin de la boucle !) Enfin time.sleep() demande à python d'attendre 0,05 s. b) Modifier le programme pour faire déplacer le triangle en diagonale et revenir à son point de départ Informatique et sciences du numérique Lycée Pierre Émile Martin Éléments de réponses Si vous êtes bloqués ou pour comparer Ex L1 Minuteur from time import* actu =time() fin=time()+5 while fin - actu >= 0 : print ("Reste ",round(fin - actu),"secondes.") sleep(1) actu = time() print ("C'est cuit !") Ex L2 Minuteur def chrono(): # on arrive ici toutes les 1000 ms global actu if actu>0: Minuteur.config(text='Reste '+str(actu)+' s' ) actu=actu-1 fen.after(1000,chrono) else: Minuteur.config(text='Stop' ) ##################################### from tkinter import * from time import * fen = Tk() fen.title("minuteur") actu=10 Minuteur=Label(fen,text="Reste 10 s") Minuteur.pack() chrono() fen.mainloop() Supplément # Créé par Leclerc, le 31/08/2013 from tkinter import* import time def chrono(): global actu,fin reste=int(round(fin-actu)) if stop==True : bouton.config(text=" OUF !!") else : if reste>0 : temps.config(text='Compte à rebour : '+str(reste)+' s') actu=time.time() fenetre.after(1000,chrono) else : temps.config(text='Compte à rebour : '+str(reste)+' s') bouton.config(text="BOUM !!") def desamorce() : global stop stop=True ########################################################### Informatique et sciences du numérique fenetre=Tk() fenetre.geometry("300x50") fenetre.title("Cliquer pour désamorcer") temps=Label(fenetre,text="COMPTE A REBOUR ",fg='red') temps.pack() bouton=Button(fenetre,text="OFF",bg='white',command=desamorce) bouton.pack() stop=False actu = time.time() fin= time.time()+10 chrono() fenetre.mainloop() Ex L3 : Diagonales from Tkinter import * import time fen = Tk() fond =Canvas(fen, width=500, height=500) fond.pack() bouton_sortir = Button(fen, text="Sortir", command=fen.destroy).pack() forme=fond.create_polygon(10, 10, 10, 60, 50, 35) for x in range(0, 100): fond.move(forme, 5, 5) fen.update() time.sleep(0.05) for x in range(0, 100): fond.move(forme, -5, -5) fen.update() time.sleep(0.05) fen.mainloop() Lycée Pierre Émile Martin