Dans ce chapitre, nous réaliserons notre premier programme utilisant PyQt, et nous verrons comment ouvrir notre première fenêtre! Les lignes de codes sont présentées sous forme de scripts python, mais il est possible, voir souhaitable de les adapter pour les exécuter sous forme interactive dans un shell python. Par exemple, la première fenètre présentée ci-dessous peut fort bien se coder dans un shell Python interactif de la manière suivante : >>> from PyQt4.QtGui import QApplication >>> a=qapplication([]) >>> a.exec_() Le problème est que cette suite d'instructions gèle le prompt, Python n'est plus accessible. Un Ctrl+Z vous sortira de ce mauvais pas. Le processus Python n'est pas tué, il est simplement inactif et inaccessible, il vous faut le tuer à la main : $ ps u pierre... 8182? 00:00:21 soffice.bin 10070 pts/0 00:00:00 python 12004 pts/1 00:00:00 bash 12075 pts/1 00:00:00 ps $ kill 9 10070 Une autre solution, plus propre, est de lancer le shell Python de la manière suivante : $ ipython q4thread In [1]: from PyQt4.QtGui import QApplication In [2]: a=qapplication([]) In [3]: a.exec_() In [4]: #vous avez la main!
Codons notre première fenêtre ouvrez votre IDE favori, par exemple kate ou gedit, emacs, gvim, et créez un nouveau fichier main.py (sans espace dans le nom du fichier, c'est important) Le code minimal d'un projet PyQt Votre projet est constitué normalement au départ d'un seul fichier : main.py avec le code : 1 #! /usr/bin/python 3 from PyQt4.QtGui import * 4 import os,sys 5 6 def main(args): 7 a=qapplication(args) 8 r=a.exec_() 9 return r 10 11 if name ==" main ": 12 main(sys.argv) C'est le code minimal d'une application utilisant PyQt. Comme vous pouvez le constater, ce qui est génial c'est que c'est vraiment très court D'autres bibliothèques vous demandent beaucoup plus de lignes de code avant de pouvoir commencer à programmer, tandis qu'avec PyQt c'est vraiment très simple et rapide.
Analysons ce code pas à pas! 1. On indique au shell où se trouve l'exécutable en charge de faire tourner le script (On aura rendu main.py exécutable par la commande chmod +x main.py.) 2. Cette importation permet d'accéder à la classe QApplication, qui est la classe de base de tout programme PyQt, ainsi qu'aux widget et autres éléments graphiques. 3. Pour accéder aux arguments 4. 5. Le programme principal sous forme de fonction. 6. QApplication, est la classe de base. La première ligne de la fonction main crée un nouvel objet de type QApplication. Cet objet est appelé a (mais vous pouvez l'appeler comme vous voulez). Le constructeur de QApplication exige que vous lui passiez les arguments du programme, c'est-à-dire les paramètres args que reçoit la fonction main. Cela permet de démarrer le programme avec certaines options précises, mais on ne s'en servira pas ici. 7. Lancement de l'application par appel à la méthode exec_ de notre objet a. Cette méthode démarre notre programme. Si vous ne le faites pas il ne se passera rien. 8. retourne le résultat de app.exec() pour dire si le programme s'est bien déroulé ou pas. 9. 10. Deux cas : Si le fichier est lancé comme un script python, par une des deux commandes $ python main.py ou bien (si le script est exécutable) $ main.py alors la variable globale name prend la valeur " main " et la fonction main est lancée. Si le fichier est utilisé comme module dans un programme (ou en ligne de commande) python par >>>import main alors la fonction main.main() devient disponible pour la suite. Ce que vous devez vous dire, c'est qu'en gros tout notre programme s'exécute à partir de ce moment-là. La méthode exec_ est gérée par PyQt : tant qu'elle s'exécute, notre programme est ouvert. Dès que la méthode exec_ est terminée, notre programme s'arrête.
Affichage d'un widget Dans la plupart des bibliothèques GUI, dont PyQt fait partie, tous les éléments d'une fenêtre sont appelés des widgets. Les boutons, les cases à cocher, les images... tout ça ce sont des widgets. La fenêtre elle-même est considérée comme un widget. Pour provoquer l'affichage d'une fenêtre, il suffit de demander à afficher n'importe quel widget. Ici par exemple, nous allons afficher un bouton. Voici le code complet que j'aimerais que vous utilisiez. Il utilise le code de base de tout à l'heure mais y ajoute quelques lignes : #! /usr/bin/python # * coding: utf 8 * from PyQt4.QtGui import * import os,sys def main(args): a=qapplication(args) bouton=qpushbutton(a.trutf8("salut les Zéros, la forme?"),none) bouton.show() r=a.exec_() return r if name ==" main ": main(sys.argv) Les lignes ajoutées ont été surlignées pour bien que vous puissiez les repérer. On voit entre autres : # * coding: utf 8 *
Cette ligne indique à python que le codage des caractères est en utf 8. A défaut l'interpréteur refusera d'exécuter un script python contenant des accents (même en commentaires) bouton=qpushbutton(a.trutf8("salut les Zéros, la forme?"),none) Cela crée un nouvel objet de type QPushButton que nous appelons tout simplement bouton, mais on aurait très bien pu l'appeler autrement. Le constructeur attend un paramètre : le texte qui sera affiché sur le bouton. (vous noterez que sous PyQt toutes les classes commencent par un "Q" d'ailleurs!). Afin d'afficher correctement le texte avec des accents, on demande à la méthode trutf8 de la Qapplication a de traduire correctement la chaîne de caractères passée en paramètre. Malheureusement, le fait de créer un bouton ne suffit pas pour qu'il soit affiché. Il faut appeler sa méthode show : bouton.show() Et voilà! Cette ligne commande l'affichage d'un bouton. Comme un bouton ne peut pas "flotter" comme ça sur votre écran, PyQt l'insère automatiquement dans une fenêtre. On a en quelque sorte créé une "fenêtre-bouton" Bien entendu, dans un vrai programme plus complexe, on crée d'abord une fenêtre et on y insère ensuite plusieurs widgets, mais là on commence simplement Notre code est prêt, il ne reste plus qu'à exécuter le programme! Vous l'avez vu, le code nécessaire pour ouvrir une fenêtre toute simple constituée d'un bouton est ridicule. Quelques lignes à peine, et rien de bien compliqué à comprendre au final. C'est ce qui fait la force de PyQt : "un code simple est un beau code" dit-on. PyQt s'efforce de respecter ce dicton à la lettre, vous vous
en rendrez compte dans les prochains chapitres. Dans les prochains chapitres, nous allons voir comment changer l'apparence du bouton, comment faire une fenêtre un peu plus complexe. Nous découvrirons aussi le mécanisme des signaux et des slots, un des principes les plus importants de PyQt qui permet de gérer les évènements : un clic sur un bouton pourra par exemple provoquer l'ouverture d'une nouvelle fenêtre ou sa fermeture!