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