[Python] Lire un gif animé
Nous souhaitons réaliser une simulation d’attente dans un programme SSI. Aussi, quoi de mieux pour faire patienter notre utilisateur qu’une jolie image animée.
Nous avons trouvé cet excellent gif animé :
et allons en faire un programme d’attente.
Virtual Box
Je n’ai pas réussi à exécuter ce programme en environnement virtualisé (problème avec la librairie PygLet).
Le code
PyGame ne semble pas prendre en charge les GIFs animés, aussi nous allons utiliser le module Python : pyglet.
Celui-ci sera installé sous Windows au travers de pip :
pip install pyglet
Et voici le code :
import pyglet
def die(dt):
pyglet.app.exit()
animation = pyglet.image.load_animation('gifvera.gif')
animSprite = pyglet.sprite.Sprite(animation)
window = pyglet.window.Window(animSprite.width, animSprite.height, "Installation en cours ...")
# image for icon
img = pyglet.resource.image("vera.ico")
window.set_icon(img)
r,g,b,alpha = 0.5,0.5,0.8,0.5
pyglet.gl.glClearColor(r,g,b,alpha)
@window.event
def on_draw():
window.clear()
animSprite.draw()
pyglet.clock.schedule_once(die, animation.get_duration())
pyglet.app.run()
Le seul élément intéressant dans ce code simplissime est la création d’une tâche planifiée qui s’exécutera en fin de déroulement de l’animation afin de fermer notre programme.
pyglet.clock.schedule_once(die, animation.get_duration())
- animation.get_duration () retourne la durée de l’animation
- schedule_once appelle la fonction die qui elle même appelle pyglet.app.exit() qui nous permet de quitter.
Icône de l’application
# image for icon
img = image = pyglet.resource.image("vera.ico")
# setting image as icon
window.set_icon(img)
All in one
Il ne serait pas forcément utile de tout mettre dans un même fichier mais comme nous savons le faire (voir article), nous allons le faire ...
- Gif intégré au code
echo 'veragif="""' > res.py
base64 gifvera.gif >> res.py
echo '"""' >> res.py
echo 'veraico="""' >> res.py
base64 vera.ico >> res.py
echo '"""' >> res.py
- Intégration du Base64
L’astuce réside dans l’utilisation des fonctions PygLet de type load qui permettent d’indiquer un flux d’octets associé à un fichier (qui n’a pas lieu alors d’exister).
image = base64.b64decode(veragif)
decodedgif = BytesIO(image)
animation = pyglet.image.load_animation('veragif.gif', file=decodedgif)
image = base64.b64decode(veraico)
decodedico = BytesIO(image)
ico = pyglet.image.load ('vera.ico', file=decodedico)
Python -> EXE
Nous allons installer les deux éléments suivants :
Pour se faire, ouvrir un invite de commande (cmd dans la barre de recherche de Windows) puis saisir les commandes suivantes :
pip install pyinstaller
pip install auto-py-to-exe
Nous obtenons l’icône à l’aide du site Red Ketchup qui nous permet de recadrer l’image et de la transformer en icône.
Ce qui nous permet d’obtenir un fichier unique de type .EXE qui nous lance le gif animé et s’arrête à la fin de l’animation.
Retrouvez l’ensemble du code ci-dessous :
V2
Le programme ne fonctionne pas sur toutes les machines Windows, il faut donc utiliser une autre parade. Je reviens donc vers PyGame qui hélas ne prend pas en charge les Gifs animés.
Je trouve la librairie : gif_pygame qui permet se traitement, je l’installe donc au travers de pip :
pip install gif_pygame
Un nouveau souci apparaît, alors que PyGame acceptait de prendre une image codée en Base64, ceci n’est pas possible avec gif_pygame. Il me faut donc inclure le fichier dans le package de py2exe (bouton Additional files).
pgIcon = pygame.image.load(convert_base64_to_io(veraico))
example_gif = gif_pygame.load(resource_path("gifvera.gif"))
On remarquera l’usage de ressouce_path pour retrouver le dossier dans lequel sont décompressés les éléments liés au programme lors de l’exécution du PE.
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
Nous obtenons ainsi l’exécutable suivant :
Construit à l’aide du code source :
Sources
- Les images sont extraites du site : Grupo Verreschi pour une utilisation unique de pédagogie et de qualité d’infographie.
- StackOverflow : How can I create a executable from a game written in pygame
Documents
-
Icône obtenue à l’aide de l’image Vera (Zip - 30.7 kio)
Accueil > Notes Techniques > Python > [Python] Lire un gif animé