Aller au contenu
M03 · D. Manipuler les modules et les bibliothèques

Réaliser des interfaces graphiques avec Tkinter

Construire une fenêtre avec Tkinter, y placer des widgets (étiquettes, zones de saisie, boutons, listes...), les organiser et réagir aux actions de l'utilisateur.

1Situer

Le convertisseur de devises écrit pour un bureau de change de Tanger fonctionne, mais dans la console : l'employé tape des chiffres sur un écran noir. Le patron veut une vraie fenêtre, avec une zone pour le montant, une liste de devises et un bouton « Convertir ». Avec Tkinter, livré avec Python, quelques dizaines de lignes suffisent.

2Comprendre

Construire une fenêtre Tkinter étape par étape
Bureau de change✕ Montant en DH : EUR USD Convertir 10.00 EUR Label Entry Radiobutton Button mainloop() convertir()

tk.Tk() crée la fenêtre principale, vide. title() lui donne un titre.

1 / 6

Tkinter est la bibliothèque graphique livrée avec Python : rien à installer. D’autres existent (wxPython, PyQt, Tix), mais Tkinter suffit pour apprendre et pour de petites applications.

Les étapes d’une application Tkinter

  1. Créer la fenêtre principale : fenetre = tk.Tk().
  2. Créer les widgets en leur donnant leur parent : tk.Button(fenetre, text="OK").
  3. Les placer avec un gestionnaire de géométrie.
  4. Relier les actions à des fonctions (événements).
  5. Lancer la boucle principale : fenetre.mainloop().

Les principaux widgets

WidgetRôle
Labelafficher un texte ou une image
Entrysaisir une ligne de texte
Buttondéclencher une action
Checkbutton / Radiobuttoncase à cocher / choix unique
Listboxliste d’éléments à sélectionner
Canvasdessiner (formes, graphiques)
Scale / Spinboxchoisir une valeur numérique
Frame / PanedWindowregrouper et organiser d’autres widgets
Menubarre de menus
messageboxfenêtres d’alerte et de confirmation

Placer les widgets

  • pack() empile les widgets (de haut en bas, ou côte à côte avec side="left") ;
  • grid(row=..., column=...) les range dans un tableau ;
  • place(x=..., y=...) les positionne au pixel près (rarement utile).

On ne mélange pas pack et grid dans un même conteneur.

Options et événements

Chaque widget a des options (text, font, bg, width…) qu’on modifie avec .config(...). Un bouton appelle la fonction donnée dans command. Pour les autres événements (touche, clic, survol), on utilise widget.bind("<Return>", fonction).

Une interface orientée objet

On écrit souvent l’application comme une classe qui hérite de tk.Tk : les widgets deviennent des attributs et les actions des méthodes. C’est ce que fait le convertisseur de l’exercice 1.

Exemple simple

Le tableau de bord d'une voiture

Des cadrans qui affichent (Label), des boutons sur lesquels on appuie (Button), un volant qu'on règle (Scale). Une interface graphique assemble des widgets, chacun avec son rôle.

Exemple simple

Bonjour en fenêtre

La plus petite application Tkinter : une fenêtre, un texte, et la boucle qui attend les clics.

import tkinter as tk

fenetre = tk.Tk()
fenetre.title("Bonjour")
tk.Label(fenetre, text="Salam !").pack()
fenetre.mainloop()

3Manipuler

Tkinter ne s'exécute pas dans le navigateur. Pour vous entraîner, classez chaque widget selon son rôle principal, puis cliquez sur « Vérifier ». Le code complet du convertisseur est dans la partie Pratiquer, à lancer sur votre ordinateur.
Label : un texte ou une image
Entry : une zone de saisie d'une ligne
Button : un bouton cliquable
Checkbutton : une case à cocher
Radiobutton : un choix unique parmi plusieurs
Frame : un cadre qui regroupe d'autres widgets
messagebox : une fenêtre d'alerte
Menu : une barre de menus avec des commandes
Scale : un curseur pour choisir une valeur
PanedWindow : des panneaux redimensionnables
Canvas : une zone de dessin
Spinbox : un nombre avec des flèches + et -

4Pratiquer

Exercice 1 · Le convertisseur de devises

Recopiez ce programme dans un fichier convertisseur.py sur votre ordinateur et lancez-le avec python convertisseur.py. Ajoutez ensuite la devise GBP (taux 12.6).

Voir le corrigé
import tkinter as tk
from tkinter import messagebox

class Convertisseur(tk.Tk):
    TAUX = {"EUR": 10.8, "USD": 9.9}      # 1 devise = x DH

    def __init__(self):
        super().__init__()
        self.title("Bureau de change")
        self.geometry("320x200")

        tk.Label(self, text="Montant en DH :").pack(pady=(12, 0))
        self.montant = tk.Entry(self, justify="center")
        self.montant.pack()

        self.devise = tk.StringVar(value="EUR")
        cadre = tk.Frame(self)
        cadre.pack(pady=6)
        for code in self.TAUX:
            tk.Radiobutton(cadre, text=code, value=code,
                           variable=self.devise).pack(side="left")

        tk.Button(self, text="Convertir", command=self.convertir).pack()
        self.resultat = tk.Label(self, text="", font=("Arial", 14))
        self.resultat.pack(pady=10)

    def convertir(self):
        try:
            dh = float(self.montant.get())
        except ValueError:
            messagebox.showerror("Erreur", "Saisissez un nombre")
            return
        taux = self.TAUX[self.devise.get()]
        self.resultat.config(text=f"{dh / taux:.2f} {self.devise.get()}")

if __name__ == "__main__":
    Convertisseur().mainloop()

Exercice 2 · Pack ou grid ?

Réécrivez la partie saisie du convertisseur avec grid : l'étiquette en ligne 0 colonne 0, la zone de saisie en ligne 0 colonne 1, le bouton en ligne 1 sur deux colonnes.

Voir le corrigé
tk.Label(self, text="Montant :").grid(row=0, column=0, padx=5, pady=5)
self.montant = tk.Entry(self)
self.montant.grid(row=0, column=1, padx=5, pady=5)
tk.Button(self, text="Convertir", command=self.convertir) \
    .grid(row=1, column=0, columnspan=2, pady=5)

Exercice 3 · Réagir à la touche Entrée

Faites en sorte que la conversion se lance aussi quand l'utilisateur appuie sur Entrée dans la zone de saisie.

Voir un indice

La méthode bind associe un événement ("<Return>") à une fonction qui reçoit l'événement en paramètre.

Voir le corrigé
self.montant.bind("<Return>", lambda evenement: self.convertir())

5Vérifier

1. Quelle instruction lance la boucle qui affiche la fenêtre et attend les actions de l'utilisateur ?
2. Comment relier un bouton à une fonction ?
3. Quel widget choisir pour laisser l'utilisateur taper son nom ?