Interface Graphique (Partie 1) : Les bases avec PyQt5 et Qt Designer
La création d'une interface graphique (GUI - Graphical User Interface) permet de rendre vos programmes plus interactifs et conviviaux. Dans ce cours, nous allons découvrir comment utiliser Qt Designer pour concevoir visuellement l'interface, et PyQt5 pour la programmer en Python.
1. Les composants de base (Widgets)
| Composant (Widget) | Rôle | Exemple d'utilisation |
|---|---|---|
Label (QLabel) |
Afficher du texte statique ou des messages qui ne peuvent pas être modifiés directement par l'utilisateur. | Titre de l'application, affichage du résultat ("Ce nombre est premier"). |
Line Edit (QLineEdit) |
Permettre à l'utilisateur de saisir une seule ligne de texte. | Zone de saisie pour demander un entier ou une chaîne de caractères. |
Push Button (QPushButton) |
Bouton cliquable pour déclencher une action (exécuter un sous-programme). | Boutons "Vérifier", "Effacer" ou "Quitter". |
2. Les propriétés et méthodes essentielles
Pour interagir avec ces composants depuis votre script Python, nous utilisons des méthodes spécifiques :
text(): Permet de récupérer (lire) le contenu saisi dans un Line Edit. Cette méthode retourne toujours une chaîne de caractères (String).setText("chaine"): Permet de modifier le texte affiché par un Label ou de pré-remplir un Line Edit.clicked.connect(fonction): Permet d'associer le clic sur un Push Button à l'exécution d'une fonction précise dans votre programme Python (gestion d'événements).
3. Comparaison : Mode Console vs Interface Graphique (Nombre Premier)
En mode console, le programme est séquentiel : il s'arrête et attend que l'utilisateur tape une valeur avec input(), puis affiche le résultat avec print().
Avec une interface graphique, le programme est dirigé par les événements (Event-driven). L'interface s'affiche et attend que l'utilisateur clique sur un bouton pour déclencher une fonction spécifique. On utilise text() à la place de input(), et setText() à la place de print().
def premier(n):
if n < 2: return False
for i in range(2, (n // 2) + 1):
if n % i == 0: return False
return True
# Saisie séquentielle
n_str = input("Donner un entier : ")
if not n_str.isdecimal() or int(n_str) < 0:
print("Veuillez donner un entier !")
else:
n = int(n_str)
if premier(n):
print(str(n) + " est premier")
else:
print(str(n) + " n'est pas premier")
def play():
# Lecture depuis le LineEdit
n = windows.txtn.text()
if n.isdecimal() == False or int(n) < 0:
# Affichage dans le Label
windows.res.setText("donner un entier")
else:
v = premier(int(n))
if v == True:
windows.res.setText(n + " est premier")
else:
windows.res.setText(n + " n'est pas premier")
# Le programme principal lie le bouton à play()
4. Exercice d'application : Vérificateur de chaîne palindrôme
Nous souhaitons créer une interface (sauvegardée sous le nom interfacepalindrome.ui) contenant :
- Une zone de saisie (LineEdit) nommée
txtchpour saisir la chaîne. - Un bouton (PushButton) nommé
btnpour lancer la vérification, et un boutonbtnclearpour vider les champs. - Un label de texte (Label) nommé
respour afficher le résultat final.
▶️ Simulation Interactive : interfacepalindrome.ui
Vérificateur de Palindrome
Code Python Complet de l'Application :
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication
def palindrome(ch):
return ch == ch[::-1]
def play():
ch = windows.txtch.text()
if ch == "":
windows.res.setText("donner une chaîne")
else:
v = palindrome(ch)
if v == True:
windows.res.setText(ch + " est un palindrome")
else:
windows.res.setText(ch + " n'est pas un palindrome")
def clear():
windows.txtch.setText("")
windows.res.setText("")
app = QApplication([])
windows = loadUi("interfacepalindrome.ui")
windows.show()
# Connexion des boutons aux fonctions correspondantes
windows.btn.clicked.connect(play)
windows.btnclear.clicked.connect(clear)
app.exec_()