Tutoriel Complet PyQt5 : Construire des GUIs Professionnelles en Python
Qu'est-ce que PyQt ?
PyQt est un binding Python pour le framework Qt, une bibliothèque C++ multiplateforme utilisée pour créer des applications GUI natives sur Windows, macOS, Linux, Android, iOS, Raspberry Pi, et plus. Le binding est maintenu par Riverbank Computing (UK), tandis que Qt est développé par The Qt Company (Finlande). PyQt donne aux développeurs Python accès au riche ensemble de widgets, networking, base de données, 3D, et capacités multimédia de Qt.
Dans ce tutoriel vous apprendrez :
- Fonctionnalités clés de PyQt5
- Versions PyQt disponibles
- Comment installer PyQt5 sur Windows, macOS et Linux
- Concepts fondamentaux PyQt et programmes d'exemple
- Composants et widgets de base
- Stratégies de layout et personnalisation de thèmes
Fonctionnalités Clés de PyQt5
PyQt5 expose plus de 600 classes couvrant :
- Interfaces Utilisateur Graphiques
- Intégration bases de données SQL (SQLite, MySQL, PostgreSQL, Oracle, ODBC)
- Rendu web via QtWebEngine
- Parsing et manipulation XML
- Networking robuste (TCP/UDP, SSL, DNS)
- Multimédia et graphismes 3D (QtMultimedia, Qt3D)
Ces capacités permettent de construire des applications desktop et embarquées complexes, haute performance. De grandes entreprises comme LG, Mercedes-Benz, AMD, Panasonic et Harman s'appuient sur Qt pour leurs stacks UI.
Versions PyQt
Riverbank Computing propose deux bindings principaux :
- PyQt4 — supporte modules Qt 4.x et Qt 5.x (pas de compatibilité ascendante)
- PyQt5 — bindings exclusivement pour Qt 5.x
De plus, PyQt3D fournit des bindings Python pour le framework Qt3D, utile pour rendu 3D temps réel et simulation.
Installation de PyQt5
Deux méthodes d'installation courantes sont décrites ci-dessous. Nous recommandons l'utilisation de packages wheel car ils incluent les binaires C++ compilés et évitent les longs processus de build.
Méthode 1 : Installation via Wheels (Recommandée)
- Ouvrez votre terminal ou invite de commande préféré.
- Exécutez
pip install PyQt5pour télécharger le wheel (≈ 50 Mo). - Vérifiez que l'installation se termine avec succès.
Exemple sur Windows :
pip install PyQt5
Une fois installé, vous pouvez importer PyQt5.QtWidgets et commencer à construire des applications.
Méthode 2 : Build depuis les Sources
La compilation depuis les sources est plus complexe car elle compile du code C++. Elle n'est nécessaire que si vous avez besoin de modifications personnalisées ou si le wheel pour votre plateforme n'est pas disponible.
Fondamentaux de la Programmation PyQt5
Voici un exemple minimal ouvrant une fenêtre 300×300 intitulée « Guru99 ». Chaque ligne est annotée pour la clarté.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
w.show()
sys.exit(app.exec_())
Explication :
QApplication— la boucle d'événements principale.QWidget— classe de base pour tous composants UI.resize()— définit dimensions fenêtre.setWindowTitle()— définit texte barre de titre.show()— affiche le widget.app.exec_()— démarre la boucle d'événements et bloque jusqu'à fermeture fenêtre.
Ajouter de l'Interactivité
L'exemple suivant ajoute un label, un bouton, et une boîte de message qui apparaît quand le bouton est cliqué. Il démontre les signaux et slots, le cœur du système d'événements Qt.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
def dialog():
mbox = QMessageBox()
mbox.setText("Votre allégeance a été notée")
mbox.setDetailedText("Vous êtes maintenant un disciple et sujet du Guru omniscient")
mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
mbox.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
label = QLabel("Voici le Guru, Guru99", w)
label.move(100, 130)
btn = QPushButton("Vu", w)
btn.move(110, 150)
btn.clicked.connect(dialog)
w.show()
sys.exit(app.exec_())
Cliquer le bouton déclenche dialog(), qui crée un QMessageBox modal.
Composants Cœur et Widgets
L'architecture PyQt5 est organisée en plusieurs modules. Comprendre cette hiérarchie aide à importer seulement ce dont vous avez besoin.
Vue d'Ensemble des Modules
- Qt — agrège tous sous-modules ; pratique pour petits scripts.
- QtCore — classes noyau non-GUI (signaux, slots, timers).
- QtWidgets — widgets GUI standards (boutons, labels, etc.).
- QtGui — primitives graphiques et peinture avancée.
- QtNetwork — sockets TCP/UDP, SSL, DNS.
- QtMultimedia — support audio/vidéo.
- QtSql — intégration base de données.
Widgets Courants
QLineEdit— saisie texte single-line.QRadioButton— bouton radio sélectionnable.QComboBox— sélecteur dropdown.QCheckBox— case à cocher toggle.QMenuBar— barre de menu horizontale.QToolBar— barre d'outils avec boutons.QTabWidget— interface à onglets.QScrollBar— widget barre de défilement.QSplitter— vue splittable redimensionnable.QDockWidget— panneau dock détachable.
Gestion de Layout
Au lieu de positionner manuellement les widgets avec move() et resize(), Qt offre des gestionnaires de layout qui arrangent automatiquement les widgets selon la taille de fenêtre.
Box Layouts (HBox & VBox)
QHBoxLayout arrange widgets horizontalement ; QVBoxLayout verticalement.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
app = QApplication([])
win = QWidget()
win.setWindowTitle("Mousquetaires")
btn1 = QPushButton("Athos")
btn2 = QPushButton("Porthos")
btn3 = QPushButton("Aramis")
hbox = QHBoxLayout(win)
hbox.addWidget(btn1)
hbox.addWidget(btn2)
hbox.addWidget(btn3)
win.show()
app.exec_()
Remplacez QHBoxLayout par QVBoxLayout pour empiler les boutons verticalement.
Grid Layout
Organisez widgets en grille 2D. La méthode addWidget() accepte indices ligne et colonne plus row-span/column-span optionnels.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication([])
win = QWidget()
layout = QGridLayout(win)
for i in range(3):
for j in range(3):
layout.addWidget(QPushButton(f"Button {i},{j}"), i, j)
win.show()
app.exec_()
Thèmes Personnalisés et Styles
PyQt5 supporte thèmes natifs et stylesheets personnalisés.
Thèmes Intégrés
Définissez le style d'application avec app.setStyle("Fusion") ou tout autre style disponible.
app = QApplication([])
app.setStyle("Fusion")
Personnalisation de Palette
Utilisez QPalette pour modifier couleurs widgets programmatiquement.
from PyQt5.QtGui import QPalette from PyQt5.QtCore import Qt palette = QPalette() palette.setColor(QPalette.ButtonText, Qt.black) palette.setColor(QPalette.Window, Qt.black) palette.setColor(QPalette.Button, Qt.gray) app.setPalette(palette)
Qt Style Sheets (CSS-like)
Pour stylisation avancée, appliquez stylesheets directement aux widgets ou à l'application entière.
btn.setStyleSheet("background-color: #4CAF50; color: white; padding: 5px;")
Points Clés à Retenir
- PyQt5 est un binding puissant pour le framework Qt, adapté aux apps desktop, embarquées, mobiles cross-platform.
- Installation préférée via wheels ; builds sources optionnels.
- Modules cœur : QtCore, QtGui, QtWidgets, QtNetwork, QtMultimedia, QtSql.
- Widgets : boutons, labels, champs texte, radio, checkboxes, menus, toolbars, tabs, splitters, docks.
- Interactivité basée sur signaux et slots de Qt.
- Layouts — Box et Grid — automatisent placement widgets, améliorant responsivité.
- Thémisation possible via styles intégrés, palettes, ou Qt Style Sheets.
- Qt Designer et Qt Creator fluidifient design UI et packaging application.
Python
- Maîtriser str.count() de Python : Compter caractères et sous-chaînes avec exemples
- Maîtriser les chaînes format() en Python avec exemples clairs
- Maîtriser la méthode String.find() de Python : Syntaxe, Exemples et Alternatives
- Maîtriser les fonctions lambda Python : exemples pratiques et bonnes pratiques
- Fonction Python round() expliquée avec exemples pratiques
- Maîtriser la fonction Python map() : syntaxe, exemples et bonnes pratiques
- Python timeit() : mesurer le temps d'exécution avec exemples pratiques
- Python Counter dans collections : comptage efficace, mise à jour et opérations arithmétiques
- Comprendre type() et isinstance() en Python : exemples pratiques