Vous êtes sur la page 1sur 10

Apprentissage de PySide, le binding Qt de Nokia

pour Python et cration d'une premire application

Par Charles-lie Gentil

Date de publication : 3 janvier 2011

Le but de ce tutoriel est de prsenter rapidement PySide.


Ce tutoriel est destin principalement aux personnes dj familires du langage de
programmation Python.
Commentez
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

I - Introduction..............................................................................................................................................................3
II - Installation de PySide............................................................................................................................................ 3
III - Prsentation des widgets de base....................................................................................................................... 3
III-A - Cration d'une fentre................................................................................................................................. 3
III-B - Cration et utilisation d'un bouton (QPushButton).......................................................................................4
III-C - Cration et utilisation d'une zone de texte non ditable (QLabel)...............................................................4
III-D - Cration et utilisation d'une zone de texte ditable (QLineEdit)..................................................................5
III-E - Cration et utilisation d'une zone de texte multi-lignes (QTextEdit)............................................................ 5
III-F - Conclusion.................................................................................................................................................... 5
IV - Prsentation d'autres widgets usuels................................................................................................................... 5
V - Le point sur les bases de donnes.......................................................................................................................7
V-A - Utilisation du module SQlite 3......................................................................................................................7
V-B - Utilisation du module QtSql.......................................................................................................................... 8
VI - Cration de notre premire application : le carnet d'adresses.............................................................................9
VII - Remerciements.................................................................................................................................................. 10

-2-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

I - Introduction

Le but de ce tutoriel est de permettre une personne familire avec Python et la programmation oriente objet, plus
communment appele OOP (Object-Oriented Programming), de raliser une application graphique fonctionnelle en
Qt et surtout "manuellement". J'entends par l sans passer par QtDesigner.
Lors de la rdaction de ce tutoriel les versions suivantes de Python et PySide taient utilises :
- Python 2.7.1 Windows XP ;
- PySide 1.0.0 beta 1.
Afin d'apprhender le mieux possible ce tutoriel il est impratif d'avoir quelques connaissances en Python. Si cela
n'tait pas le cas, je vous invite lire le tutoriel de G. Swinnen qui traite principalement de Tkinter et des notions
de base de Python.
Aprs avoir lu ce tutoriel, vous devriez tre en mesure de crer une application graphique fonctionnelle avec PySide.
Nous y verrons donc la manire de crer les widgets les plus courants et comment les utiliser. Vous pouvez retrouver
toutes les informations compltes sur les widgets vus ici, sur la documentation officielle de PySide. noter enfin
qu'une grande partie de ce tutoriel est aussi valable pour PyQt, l'autre binding Qt de Python. Il faudra principalement
faire attention aux manires de connecter un widget une action. Nous verrons ceci plus bas.

II - Installation de PySide

Vous trouverez dans la FAQ PyQt & PySide les informations ncessaires aux diverses installations de PySide.

III - Prsentation des widgets de base

Je vais prsenter ici les widgets indispensables la ralisation d'une application graphique en PySide. Je vais aussi
profiter de ce chapitre pour montrer rapidement ce que nous pouvons faire avec ces widgets. Dans ce chapitre nous
allons donc voir comment :

crer une fentre ;


y ajouter des widgets de base (label, bouton, zone de texte) ;
apprendre raliser des fonctions de base avec ces mmes widgets.

III-A - Cration d'une fentre

Afin de crer une fentre, nous utilisons la classe QWidget du module QtGui. Voici comment crer une fentre vide :

# -*- coding: iso-8859-1 -*-

## Import minimum obligatoire pour raliser une application graphique en PySide.


import sys
from PySide import QtGui

#Cration de la classe Frame issue de QWidget.


#Toute application graphique doit contenir au moins une telle classe.
class Frame(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

#Redimensionnement de la fentre principale.


self.resize(600,500)

#Application de la police d'criture Verdana la fentre mais aussi tous les widgets enfants.
# noter que nous aurions aussi pu choisir la taille et la mise en forme (gras, italique...)
self.setFont(QtGui.QFont("Verdana"))

#Titre de la fentre
self.setWindowTitle("Prsentation PySide... Prsentation des widgets de base")

#Utilisation d'une icne pour la fentre si celui est prsent dans le rpertoire courant...

-3-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

#sinon on passe.
try:
self.setWindowIcon(QtGui.Icon("icon.jpg"))
except:pass

#Les quatre lignes ci-dessous sont impratives pour lancer l'application.


app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())

III-B - Cration et utilisation d'un bouton (QPushButton)

Pour crer un bouton, nous utiliserons la classe QPushButton(string,parent) hrite du module QtGui.

#Cration du bouton
self.quit_0 = QtGui.QPushButton("Quitter\nsans message", self)

#Positionnement et dimensionnement du bouton de la forme (x,y,h,l)


self.quit_0.setGeometry(490, 450, 100, 30)

#Cration d'une connexion entre le widget QPushButton, le signal clicked et le slot quit.
self.quit_0.clicked.connect(quit)

#En PyQt cette ligne se serait crite :


#self.connect(self.quit_0, QtCore.SIGNAL("clicked()"),QtGui.qApp, QtCore.SLOT("quit()"))

# noter que quit est un slot prdfini et qu'il permet de quitter l'application proprement.
#Slot est un terme propre Qt. Certains sont prdfinis, d'autres seront crs directement par vous.
#Dans ce cas-
l, il s'agira ni plus ni moins que des fonctions que vous avez rencontres dans votre
#apprentissage de Python.

Nous aurions donc pu aussi crer un bouton activant un slot cr par nous-mme. Nous aurions procd ainsi :

self.btn_0 = QtGui.QPushButton("Action_1", self)


self.btn_0.clicked.connect(self.action1)
self.btn_0.move(0, 120)

#Cration d'un slot personnalis


def action1(self) :
print " Activation slot action1 "

III-C - Cration et utilisation d'une zone de texte non ditable (QLabel)

Pour crer une zone de texte non ditable, nous utiliserons la classe QLabel(string,parent) hrite du module QtGui.

#Cration d'un QLabel. Nous le laissons se positionner seul pour avoir un rendu.
#Il se place en haut gauche.
#Ne permet pas l'utilisateur de rentrer du texte.
self.label_0 = QtGui.QLabel("Ceci est un label", self)

#Il est possible de modifier la valeur du QLabel


self.label_0.setText(" Nouveau texte ")

#Et de rcuprer celle-ci


print self.label_0.text()

-4-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

# noter que setText() et text() fonctionne pour une grande majorit de widgets Qt.

III-D - Cration et utilisation d'une zone de texte ditable (QLineEdit)

Pour crer une zone de texte ditable, nous utiliserons la classe QLineEdit(string,parent) hrite du module QtGui.

#Cration d'un QLineEdit. Ce widget permet l'utilisateur de rentrer du texte sur une seule ligne.
self.lineedit = QtGui.QLineEdit("Ceci est un LineEdit", self)

#Positionnement du widget sans modifier sa taille.


self.lineedit.move(0, 25)

III-E - Cration et utilisation d'une zone de texte multi-lignes (QTextEdit)

Pour crer une zone de texte multi-lignes, nous utiliserons la classe QTextEdit(string,parent) hrite du module QtGui.

#Cration d'un QTextEdit. Il permet comme pour le LineEdit de rentrer du texte.


#Cependant il permet de manire automatique d'effectuer des retours la ligne et
#de mettre en place un ascenseur si besoin.
self.textedit = QtGui.QTextEdit("""Ceci est un TextEdit.
Il permet un retour la ligne dans le widget et
la cration d'un ascenseur si besoin""", self)

#Positionnement et dimensionnement du widget


self.textedit.setGeometry(0, 50, 100, 50)

III-F - Conclusion

Nous avons donc appris crer une application graphique basique et nous avons maintenant apprhend quelques
notions de base sur les widgets les plus courants. Vous trouverez ici le code regroupant tous les points vus ci-dessus,
plus quelques notions supplmentaires concernant l'utilisation des slots.
exemple
Dans le chapitre suivant nous allons montrer comment crer d'autres widgets qui pourront nous servir lors de la
cration de notre application finale.

IV - Prsentation d'autres widgets usuels

Dans ce chapitre nous allons voir comment crer trois nouveaux widgets qui sont :

une barre de menu ;


une barre de statut ;
une application avec plusieurs pages grce au QTabWidget.

Afin de crer une barre de menu et une barre de statut, nous n'allons pas faire hriter notre classe Frame d'un QWidget
mais d'un QMainWindow. Son utilisation est identique et on peut de la mme manire y ajouter diffrents widgets.
Nous verrons aussi comment utiliser le QTabWidget. Ce widget permet d'afficher sur notre application plusieurs
onglets indpendant les uns des autres. Il nous permettra donc d'avoir plusieurs "crans" sur le mme, sans avoir
grer plusieurs fentres. Voici le code permettant de crer cette fentre avec ces trois nouveaux widgets :

# -*- coding: iso-8859-1 -*-

-5-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

import sys
from PySide import QtCore, QtGui

h = 300
l = 400

class Frame(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.resize(l,h)
self.setFont(QtGui.QFont("Verdana"))
self.setWindowTitle("Prsentation PySide... Prsentation d'autres widgets")
try:
self.setWindowIcon(QtGui.Icon("icon.jpg"))
except:pass

fen = QtGui.QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((fen.width()-size.width())/2, (fen.height()-size.height())/2)

self.quit_1 = QtGui.QPushButton("Quitter", self)


self.quit_1.move(490, 450)
self.quit_1.clicked.connect(self.close)

#Cration de la barre de statut avec les informations voulues.


self.statusBar().showMessage("Utilisation de QMainWindow")

menubar = self.menuBar() ## Cration d'une barre de menu


file_ = menubar.addMenu("&Fichier") ## Ajout d'un menu.

#Cration de l'action Fermer.


#QAction reoit cinq paramtres qui sont le titre, le parent,
#le raccourci clavier, le message qui apparatra dans la barre de statut et enfin le slot qui sera appel.
self.menuquit = QtGui.QAction("&Fermer", self, shortcut=QtGui.QKeySequence.Close,
statusTip="Quitter l'application", triggered=self.close)

#Ajout de l'action cre ci-dessus.


file_.addAction(self.menuquit)

#Ajout de la fentre onglets


self.tabWidget = QtGui.QTabWidget(self)
self.tabWidget.setGeometry(0,20,l,h-40)

#Cration de deux QWidget qui permettront ensuite de crer les pages du QTabWidget
self.pnl_1 = QtGui.QWidget(self.tabWidget)

# noter que le parent du QWidget peut aussi bien tre le QTabWidget


#ou le QMainWindows. Personnellement, je prfre la premire solution afin
#de garder une hirarchie cohrente dans le code.
self.pnl_2 = QtGui.QWidget(self)

#Ajout des QWidgets en temps que Tab du QTabWidget.


#Le premier Tab portera le nom Entre et le deuxime le nom Lecture.
self.tabWidget.addTab(self.pnl_1, "Entre")
self.tabWidget.addTab(self.pnl_2, "Lecture")

#Modification de la couleur de fond des QWidget.


self.pnl_1.setPalette(QtGui.QPalette(QtGui.QColor("white")))
self.pnl_1.setAutoFillBackground(True)
self.pnl_2.setPalette(QtGui.QPalette(QtGui.QColor("white")))
self.pnl_2.setAutoFillBackground(True)

self.quit_1 = QtGui.QPushButton("Quitter", self.pnl_1)


self.quit_1.move(100, 100)
self.quit_1.clicked.connect(self.close)

app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())

-6-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

V - Le point sur les bases de donnes

Dans la suite de ce tutoriel, nous allons travailler avec des bases de donnes. Il existe plusieurs DBMS (database
management system). Python gre nativement SQlite 3. Pour des raisons de simplicit, nous allons donc baser nos
exemples sur ce DBMS.
Il existe avec PySide/PyQt deux manires de se connecter ce DBMS :

directement ;
en passant par le module QtSql.

Pour des raisons pratiques, nous allons rapidement prsenter ces deux manires de faire. Cela dit, le but de ce
tutoriel n'est pas d'approfondir nos connaissances sur les bases de donnes. Il est donc impratif pour vous d'avoir
un minimum de notions acquises si vous souhaitez aller plus loin.

V-A - Utilisation du module SQlite 3

Dans les lignes suivantes, vous verrez comment crer et travailler avec une base de donnes SQlite 3.

# -*- coding: iso-8859-1 -*-

import sqlite3

#Cration d'une nouvelle base de donnes, ainsi que de l'une des ses tables.
#Attention, dans le cas o cette table existe dj, une erreur est
#leve. Il est donc conseill de prvoir cette ventualit.
def create():
conn = sqlite3.connect("mybdd_1.db")
c = conn.cursor()
c.execute('''create table mytable (key TEXT, dep TEXT, projet TEXT)''')
conn.commit()
c.close()

#Pour ma part je procde ainsi afin d'viter de lever une erreur :


try:
create()
except:pass
#Ce n'est peut tre pas la solution la plus adapte, mais elle fonctionne trs bien.

#Enregistrement dans la table


def Save():
liste = (str('ess1'), str('ess2'), str('ess3'))
conn = sqlite3.connect("mybdd_1.db")
c = conn.cursor()
c.execute("""insert into mytable values ('%s','%s','%s')"""%liste)
conn.commit()
c.close()

#Lecture de la table
def read():
conn = sqlite3.connect("mybdd_1.db")
c = conn.cursor()

c.execute("select * from mytable")


for row in c:
print row
c.close()

-7-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

V-B - Utilisation du module QtSql

Nous avons vu plus haut comment utiliser le module SQlite 3 natif chez Python. Cela dit, Qt permet lui aussi de
manipuler des DBMS sa manire, dont SQlite 3. Le gros avantage avec le module Qt rside dans le fait que la
manire d'crire, d'interroger ou de supprimer des donnes est identique, quel que soit le DBMS choisi. Seule la
manire de s'y connecter diffre. Dans un souci de simplicit et de clart, nous allons utiliser comme DBMS avec QtSql
celui utilis prcdemment. Ce tutoriel n'ayant pas pour but de dcrire prcisment ce qui est faisable avec QtSql,
je vous invite consulter la FAQ correspondante ou la documentation officielle. Cependant nous rappellerons ici,
quelques oprations possibles.

from PySide import QtGui, QtCore, QtSql

#Dfinition du pilote de base de donnes choisi


self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")

#Cration de la base de donnes


self.db.setDatabaseName("mybdd.db")

#Ouverture de la base de donnes


self.db.open()

#Cration de la table Contact l'intrieur de la base de donnes ouverte


query = QtSql.QSqlQuery()
query.exec_('''create table Contact (
id INTEGER PRIMARY KEY,
nom TEXT,
prenom TEXT)''')

#Enregistrement des modifications.


self.db.commit()

#NOTA : les lignes ci-dessus diffrent entre les diffrents pilotes possibles, notamment avec
#les DBMS plus conventionnels qui se connectent un serveur extrieur l'application
#ncessitant une identification par login et mot de passe par exemple.
# partir de cette tape, les oprations sur les bases de donnes restent identiques
#quel que soit le pilote choisi.

#criture dans la table Contact


self.model = QtSql.QSqlTableModel()
self.model.setTable("Contact")
self.model.select()
self.model.insertRows(0, 1)
self.model.setData(self.model.index(0, 1), "Gentil")
self.model.setData(self.model.index(0, 2), "Charles-lie")
self.model.submitAll()

#Permet de compter le nombre de lignes dans la table slectionne.


nb_row = self.model.rowCount()

#Lecture de la premire ligne de la table Contact


record = self.model.record(0)
contact = record.value('prenom') + ' ' + record.value('nom')

#Fermeture de la base de donnes


self.db.close()

D'autres actions, comme la suppression ou la modification d'entres, seront abordes dans les sources disponibles
dans prochain chapitre.

-8-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

VI - Cration de notre premire application : le carnet d'adresses

Nous y voici... ce stade du tutoriel, nous avons assez de connaissances pour crer notre premire application. Je
vous propose de concevoir ensemble un carnet d'adresses minimaliste qui devra permettre :

de crer des contacts avec nom, prnom, n de tel... ;


de consulter ces contacts ;
de supprimer ces contacts ;
de modifier les informations entres d'un contact existant.

Nous allons donc commencer par crer une fentre deux onglets. Le premier permettra d'entrer un nouveau contact,
le deuxime permettra d'interroger, de modifier et de supprimer le cas chant un contact slectionn. Dans le premier
onglet, pour chaque contact, nous renseignerons :

le nom ;
le prnom ;
le n de tlphone ;
le n de fax ;
l'e-mail ;
l'adresse ;
le code postal ;
la ville.

Il faudra bien penser la mthode choisie pour enregistrer le contact cr. Ces informations seront stockes dans
une table Contact d'une base de donnes crer. Dans le deuxime onglet, le contact voulu sera slectionn via
une liste droulante dans laquelle seront renseigns le nom et le prnom de chaque contact prsent dans la table
Contact de notre base de donnes. Par la suite, nous offrirons l'utilisateur le choix entre Consulter, Modifier ou
Supprimer le contact choisi.
Afin de vous guider, voici des vues de ce que pourrait tre notre application :

-9-
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/
Apprentissage de PySide, le binding Qt de Nokia pour Python et cration d'une premire application par Charles-lie Gentil

exemple

VII - Remerciements

Un grand merci Thibaut Cuvelier et Jacques Thery pour leur relecture.

- 10 -
Copyright 2011 Charles-lie Gentil. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://ceg.developpez.com/tutoriels/pyqt/apprentissage-pyside-binding-qt-nokia-pour-python-et-creation-premiere-application/