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.
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.
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.
tk.Tk() crée la fenêtre principale, vide. title() lui donne un titre.
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.
fenetre = tk.Tk().tk.Button(fenetre, text="OK").fenetre.mainloop().| Widget | Rôle |
|---|---|
Label | afficher un texte ou une image |
Entry | saisir une ligne de texte |
Button | déclencher une action |
Checkbutton / Radiobutton | case à cocher / choix unique |
Listbox | liste d’éléments à sélectionner |
Canvas | dessiner (formes, graphiques) |
Scale / Spinbox | choisir une valeur numérique |
Frame / PanedWindow | regrouper et organiser d’autres widgets |
Menu | barre de menus |
messagebox | fenêtres d’alerte et de confirmation |
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.
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).
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.
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.
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()
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).
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()
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.
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)
Faites en sorte que la conversion se lance aussi quand l'utilisateur appuie sur Entrée dans la zone de saisie.
La méthode bind associe un événement ("<Return>") à une fonction qui reçoit l'événement en paramètre.
self.montant.bind("<Return>", lambda evenement: self.convertir())