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é :

Attente - 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.

Auto-py-to-exe

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.

Portable Exécutable Windows

Retrouvez l’ensemble du code ci-dessous :

Code source complet

 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 :

Vera2 - Portable Executable Windows

Construit à l’aide du code source :

Code source Vera 2nde version

Sources

  • Les images sont extraites du site : Grupo Verreschi pour une utilisation unique de pédagogie et de qualité d’infographie.

Accueil > Notes Techniques > Python > [Python] Lire un gif animé