Outils pour utilisateurs

Outils du site


pyqt4_images_dans_source

Intégrer et utiliser des images dans le code source

Problématique

Lorsqu'un module doit appeler un fichier image, par exemple une icône, il y a des fois où le chemin qui conduit au fichier n'est pas facile à trouver. Par exemple lorsqu'un programme complexe doit s'exécuter en même temps sous forme de code Python et sous forme d'exécutable cx_freeze.

Une solution qui élimine le problème du chemin est de convertir le fichier de l'image en chaine de caractère, d'intégrer cette chaine dans le code source et d'utiliser cette image à partir de cette chaine.

Créer une variable chaine représentant le fichier image

Prenons à titre d'exemple une icône connue par un fichier xxxxx.png.

Voilà un code qui va le convertir en chaine de caractères:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python 3, PyQt4
 
import base64
 
def fichier2source(nfc, nvar='ch64', nbcar=69, fdligne='\n'):
    """convertit le fichier nfc en variable chaine unicode pour source python"""
    with open(nfc, "rb") as f:
        chbin = f.read()
    ch64 = base64.b64encode(chbin).decode('latin1', 'strict')
    ch = nvar + ' = "\\' + fdligne
    lg = len(ch64)
    i2 = 0 
    while True:
        i1 = i2
        i2 = min(i1+nbcar, lg)
        if i2>i1:
            ch += ch64[i1:i2] + '\\' +  fdligne
        else:
            break
    ch += '"'
    return ch    
 
nfc = "xxxxx.png"
print(fichier2source(nfc, nvar="icone64"))

Et voilà le résultat:

icone64 = "\
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\
"

On utilise ici l'encodage par le module base64 parce que cela permet d'obtenir des caractères imprimables sans pour autant donner des chaines trop longues.

Il ne reste plus qu'à reprendre le texte par copier-coller pour le mettre dans le code source du programme en question.

Affichage de l'icône sous forme de chaine

Voilà la fonction qui permettra d'obtenir une icône sous forme de QIcon à partir de la chaine de caractère précédente. On passe par l'intermédiaire d'un QPixmap:

def source2icone(ch64):
    """convertit la variable chaine unicode encodée base64 en QIcon"""
    pixmap = QtGui.QPixmap()
    chbin = base64.b64decode(ch64.encode('latin1', 'strict'))
    pixmap.loadFromData(chbin)    
    return QtGui.QIcon(pixmap)        
 
icone = source2icone(icone64)

Il ne reste plus qu'à utiliser l'icone pour l'afficher dans la fenêtre avec la méthode setWindowIcon(icone).

Utilisation en tant qu'image QPixmap

Voilà une fonction similaire à la précédente qui permet d'obtenir une image QPixmap:

def source2pixmap(ch64):
    """convertit la variable chaine unicode encodée base64 en QPixmap"""
    pixmap = QtGui.QPixmap()
    chbin = base64.b64decode(ch64.encode('latin1', 'strict'))
    pixmap.loadFromData(chbin)    
    return pixmap        
 
pixmap = source2pixmap(image64)

Affichage d'une image de fond d'un texte html

Et dans la texte html, voilà comment on intègre la variable chaine de caractères “fond64” en tant que motif de fond:

html = """
...
...
<body style="background-image:url('data:image/png;base64,{}'); background-repeat:repeat">
...
...
""".format(fond64)

pyqt4_images_dans_source.txt · Dernière modification: 2014/08/15 22:38 par tyrtamos

Outils de la page