Loading [Contrib]/a11y/accessibility-menu.js
Aller au contenu

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()