Introduction aux interfaces graphiques en Python avec Qt 5 et PyQt5#
Nous allons étudier la programmation des interfaces graphiques (en anglais, on parle de GUI : Graphical User Interface) grâce à PyQt5 qui permet d’utiliser la bibliothèque Qt version 5 avec Python.
Voir aussi
Création d’une première fenêtre#
Pour créer une première fenêtre, on va utiliser la classe QWidget.
Voici un programme très simple de création d’une fenêtre graphique.
Exemple
# importations à faire pour la réalisation d'une interface graphique
import sys
from PyQt5.QtWidgets import QApplication, QWidget
# Première étape : création d'une application Qt avec QApplication
# afin d'avoir un fonctionnement correct avec IDLE ou Spyder
# on vérifie s'il existe déjà une instance de QApplication
app = QApplication.instance()
if not app: # sinon on crée une instance de QApplication
app = QApplication(sys.argv)
# création d'une fenêtre avec QWidget dont on place la référence dans fen
fen = QWidget()
# la fenêtre est rendue visible
fen.show()
# exécution de l'application, l'exécution permet de gérer les événements
app.exec_()
Exemple : On fixe la position et la taille de la fenêtre
import sys
from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication.instance()
if not app:
app = QApplication(sys.argv)
fen = QWidget()
# on donne un titre à la fenêtre
fen.setWindowTitle("Premiere fenetre")
# on fixe la taille de la fenêtre
fen.resize(500,250)
# on fixe la position de la fenêtre
fen.move(300,50)
fen.show()
app.exec_()
Exemple : Création de deux fenêtres
import sys
from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication.instance()
if not app:
app = QApplication(sys.argv)
fen1 = QWidget()
fen1.setWindowTitle("Fenetre 1")
fen1.resize(500,250)
fen1.move(300,50)
fen1.show()
fen2 = QWidget()
fen2.setWindowTitle("Fenetre 2")
fen2.resize(400,300)
fen2.move(200,150)
fen2.show()
app.exec_()
Création d’une fenêtre personnalisée#
Si nous voulons à présent que notre fenêtre dispose d’autres fonctionnalités que celles qui existent dans la classe QWidget, il nous faut créer une classe dérivée pour laquelle nous pourrons ajouter des attributs et des méthodes supplémentaires.
Exemple
import sys
from PyQt5.QtWidgets import QApplication, QWidget
class Fenetre(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("Ma fenetre")
app = QApplication.instance()
if not app:
app = QApplication(sys.argv)
fen = Fenetre()
fen.show()
app.exec_()
Voir aussi
Gestion des événements de la souris dans la fenêtre#
Pour interagir avec l’utilisateur, nous allons devoir effectuer de la programmation événementielle. Il va ainsi s’agir de gérer les événements qui seront déclenchés par l’utilisateur (appui sur la souris, etc.).
Nous allons voir comment traiter l’événement que constitue un appui sur un bouton de la souris dans la fenêtre.
Gestion de l’appui sur un bouton de la souris dans la fenêtre#
Exemple
import sys
from PyQt5.QtWidgets import QApplication, QWidget
class Fenetre(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("Ma fenetre")
def mousePressEvent(self, event):
print("appui souris")
app = QApplication.instance()
if not app:
app = QApplication(sys.argv)
fen = Fenetre()
fen.show()
app.exec_()
La méthode mousePressEvent est un gestionnaire d’événement (en anglais, event handler) qui est automatiquement appelé lors de l’appui sur un bouton de la souris. Il nous a donc suffi de redéfinir cette méthode de la classe QWidget et d’y indiquer les instructions à exécuter pour gérer cet événement. Il faut noter que dans sa définition cette méthode doit pouvoir recevoir un argument (nous verrons plus loin l’utilisation de cet argument).
Liste des gestionnaires d’événements issus de la souris#
appui sur un bouton de la souris |
|
relâchement d’un bouton de la souris |
|
double clic sur un bouton de la souris |
|
mouvement de la souris (par défaut, quand un bouton est appuyé) |
Utilisation de l’information associée à un événement#
Les arguments transmis aux méthodes qui gèrent les événements de la souris sont des objets de type QMouseEvent. Un objet de cette classe est automatiquement créé par Python lors du déclenchement de l’événement. Cet objet contient de plus d’autres informations. En particulier pour un appui sur le bouton de la souris, il contient une information concernant le bouton qui a été appuyé. Cette information peut être récupérée grâce à la méthode button. Les valeurs prises peuvent être comparées avec les constantes prédéfinies ci-dessous :
bouton gauche |
|
bouton droit |
|
bouton du milieu |
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget
class Fenetre(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("Ma fenetre")
def mousePressEvent(self,event):
if event.button() == Qt.LeftButton:
print("appui bouton gauche")
app = QApplication.instance()
if not app:
app = QApplication(sys.argv)
fen = Fenetre()
fen.show()
app.exec_()
De même, les coordonnées de la position du curseur de souris au moment de l’appui peuvent être obtenues au moyen des méthodes x et y.
Exemple
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget
class Fenetre(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("Ma fenetre")
def mousePressEvent(self,event):
if event.button() == Qt.LeftButton:
print("appui bouton gauche")
print("position = " + str(event.x()) + " " + str(event.y()))
app = QApplication.instance()
if not app:
app = QApplication(sys.argv)
fen = Fenetre()
fen.show()
app.exec_()
Dans le cas du gestionnaire mouseMoveEvent, il est possible d’activer le suivi des mouvements de la souris par la fenêtre même si aucun bouton n’est appuyé. Pour cela, il faut utiliser la méthode setMouseTracking(True) disponible pour la classe QWidget.
Exemple
import sys
from PyQt5.QtWidgets import QApplication, QWidget
class Fenetre(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("Ma fenetre")
# activation du suivi du mouvement de la souris
self.setMouseTracking(True)
def mouseMoveEvent(self,event):
print("position = " + str(event.x()) + " " + str(event.y()))
app = QApplication.instance()
if not app:
app = QApplication(sys.argv)
fen = Fenetre()
fen.show()
app.exec_()
Voir aussi