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.

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_()

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#

mousePressEvent

appui sur un bouton de la souris

mouseReleaseEvent

relâchement d’un bouton de la souris

mouseDoubleClickEvent

double clic sur un bouton de la souris

mouseMoveEvent

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 :

Qt.LeftButton

bouton gauche

Qt.RightButton

bouton droit

Qt.MidButton

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_()