Animation
Principe général¶
La programmation d’une animation est basée sur la mise en place d’une boucle infinie d’animation :
TantQue Vrai Faire
Laisser passer un certain temps dt { attente non bloquante }
Rafraîchir l’affichage
FinTantQue
Note
- les librairies graphiques fournissent en général une ou plusieurs instructions pour programmer une attente non bloquante
- certaines fournissent même des mécanismes d’animation tout prêts
Différer un appel¶
En considérant que la variable app
contient la fenêtre graphique du module guizero, la fonction app.after
permet de planifier un appel de fonction après un temps donné (exprimé en ms).
L'utilisation de la fonction app.after
ne bloque pas l'exécution du programme (attente non bloquante).
Cette fonction admet en argument :
- le délai en millisecondes avant l'appel (valeur entière)
- le nom de la fonction à appeler
- une liste
args
des arguments à fournir à la fonction lors de l'appel
Exemple
Dans cet exemple, on souhaite que le rectangle rouge s'affiche à l'ouverture de la fenêtre et que le texte s'affiche 2 secondes plus tard.
from guizero import *
def afficheTexte(x,y,monTexte):
canvas.create_text(x,y, text=monTexte)
app = App(width=500, height=500)
draw = Drawing(app, width='fill', height='fill')
canvas = draw.tk
canvas.create_rectangle(10,30,100,150, fill='red')
# afficheTexte(300,400,"Hello !") au bout de 2 s
app.after(2000, afficheTexte, args=[300,400,"Hello !"])
app.display()
Animation et Canvas¶
L'astuce pour programmer une animation consiste à écrire une fonction de rafraîchissement qui s’appelle elle-même au bout d’un certain temps d'attente (non bloquante).
Lancer l’animation se fera en appelant une seule fois la fonction de rafraîchissement.
Appliquons ce principe sur un rectangle qui doit se déplacer d'1 pixel vers le bas et de 2 pixels vers la gauche, 50 fois par seconde.
from guizero import *
# fonction de déplacement du rectangle
def deplacerRectangle(dt, dx, dy):
app.after(dt, deplacerRectangle, args=[dt, dx, dy])
canvas.move(rect, dx, dy)
# Création de la fenêtre et du canvas
app = App(width=500, height=500)
draw = Drawing(app, width='fill', height='fill')
canvas = draw.tk
# placement du rectangle
rect = canvas.create_rectangle(10, 10,110,150, fill='green')
# lancement de l'animation, fréquence 50Hz
deplacerRectangle(1000//50, 1, 2)
# Lancement
app.display()