Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
pyqt4_images_dans_source [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


pyqt4_images_dans_source

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Dernière révision Les deux révisions suivantes
pyqt4_images_dans_source [2014/08/15 21:44]
tyrtamos
pyqt4_images_dans_source [2014/08/15 22:15]
tyrtamos
Ligne 1: Ligne 1:
-====== Intégrer et utiliser des images dans le code source Python ======+====== Intégrer et utiliser des images dans le code source ======
  
 ===== Problématique ===== ===== 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 ===== ===== 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:
 +
 +<code python>#!/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"))
 +</code>
 +
 +Et voilà le résultat:
 +
 +<code python>icone64 = "\
 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\
 +"
 +</code>
 +
 +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 ===== ===== 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:
 +
 +<code python>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)
 +</code>
 +
 +Il ne reste plus qu'à utiliser l'icone pour l'afficher dans la fenêtre avec la méthode setWindowIcon(icone).
  
  
pyqt4_images_dans_source.txt · Dernière modification: 2014/08/15 22:38 de tyrtamos