PyQt : la rencontre entre Python et Qt

L’existence d’un binding pour utiliser Qt depuis Python faisait partie de ma liste des bonnes raisons d’apprendre Python. J’avais déjà utilisé Qt en version originale, c’est-à-dire en C++, pour faire des interfaces graphiques ou gérer une base de données. Vous pouvez voir le code sur ma page Github les projets UnMineMe et DiskDB. La possibilité de faire mes interfaces graphiques en Python grâce à Qt et réutiliser mes connaissances de ce framework était donc un point positif.

PyQt ou PySide ?

Il existe en fait deux bindings de Qt vers Python. L’un est développé par Riverbank Computing et s’appelle PyQt. Il est disponible comme les anciennes versions de Qt sous une double licence GPL ou commerciale. Le second a été lancé par Nokia pour introduire une licence LGPL (ce que Riverbank Computing n’avait pas accepté de faire) unique et s’appelle PySide. La principale différence (et peut-être unique différence importante) est celle de la licence. On peut lire ici et là que PyQt est un projet plus mature car plus ancien. C’est cette raison qui m’avait fait choisir PyQt plutôt que PySide. Néanmoins, il est probable que cet argument soit vieillissant et ne sera bientôt plus d’actualité, si ce n’est pas déjà le cas. Une page de Qt liste les différences entre PyQt et PySide et montre que la compatibilité est forte : http://qt-project.org/wiki/Differences_Between_PySide_and_PyQt

Installation

Commençons par installer PyQt en nous rendant à la page de téléchargement de PyQt4, la dernière version du framework. L’intérêt tant de Python que de Qt est leur portabilité, j’ai testé sur deux plateformes. J’ai d’abord commencé par Windows XP pour lequel il existe des binaires d’installation, à choisir parmi une liste en fonction de sa version de Python et de son type de processeur. Dans mon cas, j’ai choisi PyQt-Py2.7-x86-gpl-4.9.4-1.exe. Ça s’installe tout seul, c’est très facile. J’ai développé mon application (j’y reviens plus tard) et j’ai ensuite installé PyQt sur Mac OS X à partir des sources. Comme indiqué en haut de la page de téléchargement, il faut disposer de SIP pour pouvoir compiler les sources de PyQt. SIP est un outil développé par Riverbank Computing et qui sert à construire des bindings Python pour des bibliothèques C et C++. Si vous ne disposez pas de SIP, et en toute logique vous n’en disposez pas, téléchargez les sources depuis cette page et installez-le.

La compilation pour SIP et pour PyQt se fait de la même façon :

python configure.py
make
make install

Un sudo sera sûrement nécessaire pour la dernière commande. Pour vérifier que PyQt est bien installé, tant sous Windows XP que sous Mac OS X, il suffit de lancer IDLE et de vérifier que l’import du module Qt fonctionne :

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import PyQt4
>>>

Premier programme

Parlons maintenant de programmation. Si comme moi vous connaissez déjà Qt et Python, vous retrouvez rapidement vos petits. Sinon, quelques tutoriels sur PyQt et surtout sur Qt vous lanceront rapidement. Les mécanismes sont les mêmes qu’en C++, la souplesse de Python en plus (pas de compilation, pas de fichier .pro).

On commence par créer une QApplication, on crée un widget et on l’affiche :

import sys
from PyQt4 import QtCore, QtGui, QtWebKit

app = QtGui.QApplication(sys.argv) # pour recuperer les arguments du script

w = QtGui.QLabel("Simple comme Python et Qt !")
w.setWindowTitle("PyQt")
w.setGeometry(200, 200, 200, 30)
w.show()

sys.exit( app.exec_() ) # pour que le script renvoie le code la QApplication

Le reste n’est que lecture de documentation et art de programmation. A propos de documentation justement, la documentation de Qt reste la bible de référence. Il existe une documentation des classes PyQt faite par Riverbank Computing mais elle a de nombreux défauts, à commencer par sa mise en page bien moins belle, en passant par le simple rappel des prototypes et non une vraie description des méthodes, et terminant par des exemples en C++ et non Python la plupart du temps. Mais, elle s’avère utile voire indispensable dans certains cas. Je citerai par exemple l’utilisation de la classe QInputDialog et ses méthodes statiques telles que getText : Qt utilise une valeur de retour et un paramètre passé par référence ; PyQt renvoie un couple de valeurs.

Programme complet et portabilité

Suite à un sujet sur le forum Python de Developpez.com, j’ai utilisé PyQt pour coder une application qui bascule à intervalle de temps régulier entre deux onglets contenant chacun une page Internet. J’ai étoffé l’application pour ajouter ou supprimer des onglets, arrêter et redémarrer le changement automatique et sa période. Ce code est aussi sur ma page Github.

Je l’ai développé sous Windows XP et je l’ai lancé sans aucune modification sous Mac OS X. Portabilité démontrée !

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s