Apprentissage de PySide, le binding Qt de Nokia pour Python et création d'une première application
Date de publication : 03 janvier 2011
Par
Charles-Élie Gentil
Le but de ce tutoriel est de présenter rapidement PySide.
Ce tutoriel est destiné principalement aux personnes déjà familières du langage de programmation Python.
2 commentaires
I. Introduction
II. Installation de PySide
III. Présentation des widgets de base
III-A. Création d'une fenêtre
III-B. Création et utilisation d'un bouton (QPushButton)
III-C. Création et utilisation d'une zone de texte non éditable (QLabel)
III-D. Création et utilisation d'une zone de texte éditable (QLineEdit)
III-E. Création et utilisation d'une zone de texte multi-lignes (QTextEdit)
III-F. Conclusion
IV. Présentation d'autres widgets usuels
V. Le point sur les bases de données
V-A. Utilisation du module SQlite 3
V-B. Utilisation du module QtSql
VI. Création de notre première application : le carnet d'adresses
VII. Remerciements
I. Introduction
Le but de ce tutoriel est de permettre à une personne familière avec Python et la programmation orientée
objet, plus communément appelée OOP
(Object-Oriented Programming), de réaliser une application
graphique fonctionnelle en Qt et surtout "manuellement". J'entends par là sans passer par QtDesigner.
Lors de la rédaction de ce tutoriel les versions suivantes de Python et
PySide
étaient utilisées :
-
Python 2.7.1 Windows
XP ;
-
PySide 1.0.0 beta 1.
Afin d'appréhender le mieux possible ce tutoriel il est impératif 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.
Après avoir lu ce tutoriel, vous devriez être en mesure de créer une application graphique fonctionnelle
avec PySide. Nous y verrons donc la manière de créer les widgets les plus courants et comment les utiliser. Vous
pouvez retrouver toutes les informations complètes 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 manières de connecter un widget à une action.
Nous verrons ceci plus bas.
II. Installation de PySide
Vous trouverez dans la
FAQ PyQt
& PySide les informations nécessaires aux diverses installations de PySide.
III. Présentation des widgets de base
Je vais présenter ici les widgets indispensables à la réalisation 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 :
-
créer une fenêtre ;
-
y ajouter des widgets de base (label, bouton, zone de texte) ;
-
apprendre à réaliser des fonctions de base avec ces mêmes widgets.
III-A. Création d'une fenêtre
Afin de créer une fenêtre, nous utilisons la classe QWidget du module QtGui. Voici comment créer une fenêtre
vide :
import sys
from PySide import QtGui
class Frame(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.resize(600,500)
self.setFont(QtGui.QFont("Verdana"))
self.setWindowTitle("Présentation PySide... Présentation des widgets de base")
try:
self.setWindowIcon(QtGui.Icon("icon.jpg"))
except:pass
app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())
|
III-B. Création et utilisation d'un bouton (QPushButton)
Pour créer un bouton, nous utiliserons la classe QPushButton(string,parent) héritée du module QtGui.
self.quit_0 = QtGui.QPushButton("Quitter\nsans message", self)
self.quit_0.setGeometry(490, 450, 100, 30)
self.quit_0.clicked.connect(quit)
|
Nous aurions donc pu aussi créer un bouton activant un slot créé par nous-même. Nous aurions procédé
ainsi :
self.btn_0 = QtGui.QPushButton("Action_1", self)
self.btn_0.clicked.connect(self.action1)
self.btn_0.move(0, 120)
def action1(self) :
print " Activation slot action1 "
|
III-C. Création et utilisation d'une zone de texte non éditable (QLabel)
Pour créer une zone de texte non éditable, nous utiliserons la classe QLabel(string,parent) héritée du module QtGui.
self.label_0 = QtGui.QLabel("Ceci est un label", self)
self.label_0.setText(" Nouveau texte ")
print self.label_0.text()
|
III-D. Création et utilisation d'une zone de texte éditable (QLineEdit)
Pour créer une zone de texte éditable, nous utiliserons la classe QLineEdit(string,parent) héritée du module QtGui.
self.lineedit = QtGui.QLineEdit("Ceci est un LineEdit", self)
self.lineedit.move(0, 25)
|
III-E. Création et utilisation d'une zone de texte multi-lignes (QTextEdit)
Pour créer une zone de texte multi-lignes, nous utiliserons la classe QTextEdit(string,parent) héritée du module QtGui.
self.textedit = QtGui.QTextEdit("""Ceci est un TextEdit.
Il permet un retour à la ligne dans le widget et
la création d'un ascenseur si besoin""", self)
self.textedit.setGeometry(0, 50, 100, 50)
|
III-F. Conclusion
Nous avons donc appris à créer une application graphique basique et nous avons maintenant appréhendé
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 supplémentaires
concernant l'utilisation des slots.
exemple
Dans le chapitre suivant nous allons montrer comment créer d'autres widgets qui pourront nous servir
lors de la création de notre application finale.
IV. Présentation d'autres widgets usuels
Dans ce chapitre nous allons voir comment créer trois nouveaux widgets qui sont :
-
une barre de menu ;
-
une barre de statut ;
-
une application avec plusieurs pages grâce au QTabWidget.
Afin de créer une barre de menu et une barre de statut, nous n'allons pas faire hériter notre classe Frame d'un
QWidget mais d'un QMainWindow. Son utilisation est identique et on peut de la même manière y ajouter différents widgets.
Nous verrons aussi comment utiliser le QTabWidget. Ce widget permet d'afficher sur notre application plusieurs
onglets indépendant les uns des autres.
Il nous permettra donc d'avoir plusieurs "écrans" sur le même, sans avoir à gérer plusieurs fenêtres.
Voici le code permettant de créer cette fenêtre avec ces trois nouveaux widgets :
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("Présentation PySide... Présentation 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)
self.statusBar().showMessage("Utilisation de QMainWindow")
menubar = self.menuBar()
file_ = menubar.addMenu("&Fichier")
self.menuquit = QtGui.QAction("&Fermer", self, shortcut=QtGui.QKeySequence.Close,
statusTip="Quitter l'application", triggered=self.close)
file_.addAction(self.menuquit)
self.tabWidget = QtGui.QTabWidget(self)
self.tabWidget.setGeometry(0,20,l,h-40)
self.pnl_1 = QtGui.QWidget(self.tabWidget)
self.pnl_2 = QtGui.QWidget(self)
self.tabWidget.addTab(self.pnl_1, "Entrée")
self.tabWidget.addTab(self.pnl_2, "Lecture")
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_())
|
V. Le point sur les bases de données
Dans la suite de ce tutoriel, nous allons travailler avec des bases de données.
Il existe plusieurs DBMS (database management system). Python gère nativement SQlite 3.
Pour des raisons de simplicité, nous allons donc baser nos exemples sur ce DBMS.
Il existe avec PySide/PyQt deux manières de se connecter à ce DBMS :
-
directement ;
-
en passant par le module QtSql.
Pour des raisons pratiques, nous allons rapidement présenter ces deux manières de faire.
Cela dit, le but de ce tutoriel n'est pas d'approfondir nos connaissances sur les bases de données.
Il est donc impératif 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 créer et travailler avec une base de données SQlite 3.
import sqlite3
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()
try:
create()
except:pass
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()
def read():
conn = sqlite3.connect("mybdd_1.db")
c = conn.cursor()
c.execute("select * from mytable")
for row in c:
print row
c.close()
|
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 manière, dont SQlite 3. Le gros avantage
avec le module Qt réside dans le fait que la manière d'écrire, d'interroger ou de supprimer des
données est identique, quel que soit le DBMS choisi.
Seule la manière de s'y connecter diffère.
Dans un souci de simplicité et de clarté, nous allons utiliser comme DBMS avec QtSql celui utilisé
précédemment.
Ce tutoriel n'ayant pas pour but de décrire précisément ce qui est faisable avec QtSql, je vous invite
à consulter la
FAQ correspondante ou la
documentation officielle.
Cependant nous rappellerons ici, quelques opérations possibles.
from PySide import QtGui, QtCore, QtSql
self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("mybdd.db")
self.db.open()
query = QtSql.QSqlQuery()
query.exec_('''create table Contact (
id INTEGER PRIMARY KEY,
nom TEXT,
prenom TEXT)''')
self.db.commit()
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()
nb_row = self.model.rowCount()
record = self.model.record(0)
contact = record.value('prenom') + ' ' + record.value('nom')
self.db.close()
|
D'autres actions, comme la suppression ou la modification d'entrées, seront abordées dans les sources disponibles dans
prochain chapitre.
VI. Création de notre première application : le carnet d'adresses
Nous y voici... À ce stade du tutoriel, nous avons assez de connaissances pour créer notre première
application.
Je vous propose de concevoir ensemble un carnet d'adresses minimaliste qui devra permettre :
-
de créer des contacts avec nom, prénom, n° de tel... ;
-
de consulter ces contacts ;
-
de supprimer ces contacts ;
-
de modifier les informations entrées d'un contact existant.
Nous allons donc commencer par créer une fenêtre à deux onglets. Le premier permettra d'entrer un nouveau
contact, le deuxième permettra d'interroger, de modifier et de supprimer le cas échant un contact
sélectionné.
Dans le premier onglet, pour chaque contact, nous renseignerons :
-
le nom ;
-
le prénom ;
-
le n° de téléphone ;
-
le n° de fax ;
-
l'e-mail ;
-
l'adresse ;
-
le code postal ;
-
la ville.
Il faudra bien penser à la méthode choisie pour enregistrer le contact créé.
Ces informations seront stockées dans une table Contact d'une base de données à créer.
Dans le deuxième onglet, le contact voulu sera sélectionné via une liste déroulante dans laquelle
seront renseignés le nom et le prénom de chaque contact présent dans la table Contact de notre base
de données.
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 :
exemple
VII. Remerciements
Un grand merci à Thibaut Cuvelier et Jacques Thery pour leur relecture.


Copyright © 2011 Charles-Élie Gentil. Aucune reproduction, même 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 intérêts. Droits de diffusion permanents accordés à Developpez LLC.
Cette page est déposée.