PyQt en Python
PyQt est une puissante bibliothèque Python pour créer des interfaces graphiques utilisateur (GUI), qui peut être utilisée pour remplacer Tkinter intégré à Python.
PyQt est la liaison Python du framework Qt, largement utilisé dans le développement d'applications de bureau.
Qt est un framework de développement d'applications C++ multiplateforme.
PyQt permet aux développeurs Python d'exploiter la bibliothèque Qt pour créer de puissantes applications GUI.
PyQt possède les versions majeures suivantes :
- PyQt4 : liaisons basées sur Qt4
- PyQt5 : liaisons basées sur Qt5
- PyQt6 : liaisons basées sur Qt6 (dernière version)
Installation de PyQt
Installer PyQt5 avec pip :
# 安装PyQt5 pip install PyQt5 # 安装Qt设计师和其他工具(可选) pip install PyQt5-tools
Premier programme PyQt
Créer une fenêtre simple
Ce qui suit est un programme PyQt de base qui crée une fenêtre vide :
Exemple
# Créer une instance d'application
app = QApplication([])
# Créer la fenêtre principale
window = QWidget()
window.setWindowTitle("Mon premier programme PyQt")
window.setGeometry(100, 100, 400, 300) # (x, y, largeur, hauteur)
# Afficher la fenêtre
window.show()
# Exécuter l'application
app.exec_()

Explication de code
QApplicationGère le flux de contrôle et les paramètres principaux des applications GUI.QWidgetLa classe de fenêtre la plus élémentaire ; tous les composants d'interface utilisateur en héritent.setWindowTitle()Définit le titre de la fenêtre.setGeometry()Définit la position et la taille de la fenêtre.show()Affiche la fenêtre.app.exec_()Démarre la boucle d'événements et attend l'interaction de l'utilisateur.
Une application PyQt typique se compose des parties suivantes :
- Objet QApplicationChaque application PyQt a besoin d'une instance QApplication.
- Fenêtres et widgetsComposants d'interface utilisateur.
- Boucle d'événementsUne boucle qui gère les entrées utilisateur et les événements système.
- Gestionnaires d'événementsFonctions ou méthodes qui répondent aux événements.
Exemple
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# Définir le titre et la taille de la fenêtre
self.setWindowTitle("Ma première application PyQt")
self.setGeometry(100, 100, 400, 300) # x, y, largeur, hauteur
# Créer un bouton
self.button = QPushButton("Cliquez-moi", self)
self.button.setGeometry(150, 150, 100, 30)
self.button.clicked.connect(self.button_clicked)
def button_clicked(self):
print("Le bouton a été cliqué !")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Widgets PyQt courants
Bouton (QPushButton)
Exemple
button = QPushButton("Cliquez-moi", window)
button.move(150, 150) # Définir la position du bouton
Étiquette (QLabel)
Exemple
label = QLabel("Bonjour PyQt !", window)
label.move(100, 100)
Zone de texte (QLineEdit)
Exemple
textbox = QLineEdit(window)
textbox.move(100, 50)
Pour plus de widgets courants, voir :https://www.example.com/python3/python-pyqt-widgets.html
Gestion de la mise en page (QVBoxLayout)
L'utilisation de gestionnaires de disposition peut ajuster automatiquement la position des widgets :
Exemple
layout = QVBoxLayout()
layout.addWidget(QLabel("Nom d'utilisateur"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Connexion"))
window.setLayout(layout)
Pour plus de contenu sur la gestion de la mise en page, voir :https://www.example.com/python3/python-pyqt-layout.html
Mécanisme de signaux et de slots
PyQt utilise le mécanismeSignaletSlotpour gérer les événements.
Le mécanisme de signaux et de slots de PyQt est le mécanisme central pour la communication entre objets.
- Signal : Une notification émise lorsqu'un événement spécifique se produit.
- Slot : Une fonction ou méthode qui répond aux signaux.
Exemple
def on_button_click():
print("Le bouton a été cliqué !")
button = QPushButton("Cliquez-moi", window)
button.clicked.connect(on_button_click) # Connecter le signal et le slot
Signaux personnalisés
Exemple
class MyEmitter(QObject):
my_signal = pyqtSignal(str) # Définir un signal
emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Signal reçu : {x}"))
emitter.my_signal.emit("Bonjour") # Émettre le signal
Pour plus de contenu sur la gestion des dispositions, voir :https://www.example.com/python3/python-pyqt-signals-and-slots.html
Utilisation de Qt Designer
Qt Designer est un outil de conception visuelle qui vous permet de glisser-déposer des widgets pour concevoir des interfaces :
- Lancez Designer (généralement situé dans le répertoire Lib\site-packages\qt5_applications\Qt\bin de votre installation Python)
- Concevez l'interface et enregistrez-la en tant que fichier.uifile
convertira le fichier.uien code Python :
pyuic5 input.ui -o output.py
Utilisez l'interface générée dans le code :
Exemple
# Charger le fichier UI
Form, Window = uic.loadUiType("output.ui")
# Utiliser l'interface utilisateur
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())
Exercice pratique : application simple de bloc-notes
Conception d'interface
Exemple
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
QAction, QFileDialog, QMessageBox)
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
self.create_actions()
self.create_menus()
self.setWindowTitle('Bloc-notes simple')
self.setGeometry(100, 100, 800, 600)
def create_actions(self):
# Actions du menu Fichier
self.new_action = QAction('Nouveau', self)
self.new_action.setShortcut('Ctrl+N')
self.new_action.triggered.connect(self.new_file)
self.open_action = QAction('Ouvrir', self)
self.open_action.setShortcut('Ctrl+O')
self.open_action.triggered.connect(self.open_file)
self.save_action = QAction('Enregistrer', self)
self.save_action.setShortcut('Ctrl+S')
self.save_action.triggered.connect(self.save_file)
self.exit_action = QAction('Quitter', self)
self.exit_action.setShortcut('Ctrl+Q')
self.exit_action.triggered.connect(self.close)
# Actions du menu Édition
self.copy_action = QAction('Copier', self)
self.copy_action.setShortcut('Ctrl+C')
self.copy_action.triggered.connect(self.text_edit.copy)
self.paste_action = QAction('Coller', self)
self.paste_action.setShortcut('Ctrl+V')
self.paste_action.triggered.connect(self.text_edit.paste)
self.cut_action = QAction('Couper', self)
self.cut_action.setShortcut('Ctrl+X')
self.cut_action.triggered.connect(self.text_edit.cut)
def create_menus(self):
menubar = self.menuBar()
# Menu Fichier
file_menu = menubar.addMenu('Fichier')
file_menu.addAction(self.new_action)
file_menu.addAction(self.open_action)
file_menu.addAction(self.save_action)
file_menu.addSeparator()
file_menu.addAction(self.exit_action)
# Menu Édition
edit_menu = menubar.addMenu('Édition')
edit_menu.addAction(self.copy_action)
edit_menu.addAction(self.paste_action)
edit_menu.addAction(self.cut_action)
def new_file(self):
self.text_edit.clear()
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, 'Ouvrir un fichier')
if filename:
try:
with open(filename, 'r') as f:
self.text_edit.setText(f.read())
except Exception as e:
QMessageBox.warning(self, 'Erreur', f'Impossible d’ouvrir le fichier : {e}')
def save_file(self):
filename, _ = QFileDialog.getSaveFileName(self, 'Enregistrer le fichier')
if filename:
try:
with open(filename, 'w') as f:
f.write(self.text_edit.toPlainText())
except Exception as e:
QMessageBox.warning(self, 'Erreur', f'Impossible d’enregistrer le fichier : {e}')
if __name__ == '__main__':
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec_())

Widgets principaux de PyQt5
La plupart des widgets se trouvent dans PyQt5.QtWidgets.
Les fonctionnalités avancées (telles que le multimédia, la mise en réseau) peuvent nécessiter d'autres modules (par exemple, QtCore, QtGui, QtNetwork, etc.).
QListView/QTableView/QTreeView doivent être utilisés avec un modèle de données (tel que QStandardItemModel) pour une plus grande flexibilité.
Autres extensions d'installation :
pip install PyQtWebEngine # 网页支持 pip install PyQtChart # 图表支持
| Catégorie de widget | Nom du widget | Module | Description |
|---|---|---|---|
| Widgets de fenêtre de base | QWidget | QtWidgets | Classe de base pour tous les objets d'interface utilisateur, peut être utilisée comme une fenêtre vide ou un conteneur. |
QMainWindow | QtWidgets | Cadre de fenêtre principale, contenant une barre de menu, une barre d'outils, une barre d'état, etc. | |
QDialog | QtWidgets | Classe de base pour les boîtes de dialogue, utilisée pour les fenêtres pop-up. | |
| Gestion de la disposition | QVBoxLayout | QtWidgets | Gestionnaire de disposition verticale |
QHBoxLayout | QtWidgets | Gestionnaire de disposition horizontal | |
QGridLayout | QtWidgets | Gestionnaire de disposition en grille | |
QFormLayout | QtWidgets | Gestionnaire de disposition de formulaire (paires libellé + champ de saisie) | |
| Classes de boutons | QPushButton | QtWidgets | Bouton normal |
QRadioButton | QtWidgets | Bouton radio | |
QCheckBox | QtWidgets | Case à cocher | |
QToolButton | QtWidgets | Bouton de barre d'outils (peut avoir une icône) | |
| Widgets de saisie | QLineEdit | QtWidgets | Zone de saisie de texte sur une ligne |
QTextEdit | QtWidgets | Éditeur de texte enrichi multiligne (prend en charge le HTML) | |
QPlainTextEdit | QtWidgets | Éditeur de texte brut multiligne | |
QSpinBox | QtWidgets | Zone de sélection numérique (entier) | |
QDoubleSpinBox | QtWidgets | Zone de sélection numérique (flottant) | |
QComboBox | QtWidgets | Liste déroulante | |
QDateEdit | QtWidgets | Sélecteur de date | |
QTimeEdit | QtWidgets | Sélecteur d'heure | |
QDateTimeEdit | QtWidgets | Sélecteur de date et d'heure | |
QSlider | QtWidgets | Curseur (horizontal/vertical) | |
QDial | QtWidgets | Bouton rotatif | |
| Widgets d'affichage | QLabel | QtWidgets | Étiquette texte/image |
QLCDNumber | QtWidgets | Afficheur numérique LCD | |
QProgressBar | QtWidgets | Barre de progression | |
QStatusBar | QtWidgets | Barre d'état (généralement utilisée pourQMainWindow) | |
| Classes de conteneur | QGroupBox | QtWidgets | Cadre de groupe (conteneur avec titre) |
QTabWidget | QtWidgets | Conteneur d'onglets | |
QStackedWidget | QtWidgets | Conteneur empilé (affiche un widget enfant à la fois) | |
QScrollArea | QtWidgets | Conteneur de zone de défilement | |
QMdiArea | QtWidgets | Zone MDI (Multiple Document Interface) | |
| Liste/Table/Arborescence | QListWidget | QtWidgets | Contrôle de liste (avec gestion des éléments) |
QTreeWidget | QtWidgets | Widget d'arborescence | |
QTableWidget | QtWidgets | Widget de tableau | |
QListView | QtWidgets | Vue de liste (nécessite un modèle de données) | |
QTableView | QtWidgets | Vue de tableau (nécessite un modèle de données) | |
QTreeView | QtWidgets | Vue d'arborescence (nécessite un modèle de données) | |
| Menu/Barre d'outils | QMenuBar | QtWidgets | Barre de menus |
QMenu | QtWidgets | Menu (peut contenir des sous-menus et des actions) | |
QToolBar | QtWidgets | Barre d'outils | |
QAction | QtWidgets | Action (utilisée pour les éléments de menu, les boutons de barre d'outils, etc.) | |
| Boîte de dialogue | QFileDialog | QtWidgets | Boîte de dialogue de sélection de fichier |
QColorDialog | QtWidgets | Boîte de dialogue de sélection de couleur | |
QFontDialog | QtWidgets | Boîte de dialogue de sélection de police | |
QInputDialog | QtWidgets | Boîte de dialogue de saisie (texte, nombres, etc.) | |
QMessageBox | QtWidgets | Boîte de message (avertissement, erreur, question, etc.) | |
| Vue graphique | QGraphicsView | QtWidgets | Graphics View Framework (pour les graphiques 2D) |
QGraphicsScene | QtWidgets | Scène graphique (pour une utilisationQGraphicsViewcombinée) | |
| Autres composants fonctionnels | QCalendarWidget | QtWidgets | Widget de calendrier |
QSplashScreen | QtWidgets | Écran de démarrage | |
QSystemTrayIcon | QtWidgets | Icône de la zone de notification | |
QWebEngineView | QtWebEngineWidgets | Composant de navigateur Web (nécessite une installation séparéePyQtWebEngine) |