OUJOOD.COM
Le widget Listbox affiche une liste d'éléments texte dans lesquels l'utilisateur peut faire une sélection. C'est l'alternative à Combobox quand on veut que toute la liste soit visible en permanence, ou quand plusieurs éléments peuvent être sélectionnés simultanément.
Listbox simple avec sélection
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Listbox simple")
fenetre.geometry("300x260")
langages = ["Python", "JavaScript", "Java", "C++", "Rust",
"Go", "TypeScript", "PHP", "Ruby", "Swift"]
liste = tk.Listbox(fenetre, height=8, width=25, font=("Arial", 11))
liste.pack(padx=20, pady=15)
for lang in langages:
liste.insert(tk.END, lang)
def afficher_selection():
indices = liste.curselection() # tuple des indices sélectionnés
if indices:
valeur = liste.get(indices[0])
label.config(text=f"Sélectionné : {valeur}")
else:
label.config(text="Aucune sélection")
tk.Button(fenetre, text="Valider", command=afficher_selection).pack()
label = tk.Label(fenetre, text="")
label.pack(pady=5)
fenetre.mainloop()
curselection() retourne un tuple d'indices — pas directement les valeurs. Pour obtenir la valeur correspondante, on passe l'indice à get(). Si rien n'est sélectionné, curselection() retourne un tuple vide — il faut toujours vérifier avant d'accéder à l'indice 0.
Multi-sélection
Le paramètre selectmode contrôle le comportement de sélection :
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Multi-sélection")
fenetre.geometry("320x280")
competences = ["HTML", "CSS", "JavaScript", "Python", "SQL",
"Git", "Docker", "Linux", "React", "Django"]
# EXTENDED : clic + Maj pour une plage, clic + Ctrl pour des éléments épars
liste = tk.Listbox(fenetre, height=8, width=22,
selectmode=tk.EXTENDED, font=("Arial", 11))
liste.pack(padx=20, pady=15)
for comp in competences:
liste.insert(tk.END, comp)
def afficher():
indices = liste.curselection()
valeurs = [liste.get(i) for i in indices]
if valeurs:
label.config(text=", ".join(valeurs))
else:
label.config(text="Aucune sélection")
tk.Button(fenetre, text="Voir la sélection", command=afficher).pack()
label = tk.Label(fenetre, text="", wraplength=260)
label.pack(pady=8)
fenetre.mainloop()
Les quatre modes disponibles : SINGLE (un seul élément), BROWSE (un seul, sélection par glissement — défaut), MULTIPLE (clic bascule chaque élément), EXTENDED (sélection en plage avec Maj et Ctrl). EXTENDED est le plus proche du comportement attendu par les utilisateurs habitués aux sélections de fichiers.
Listbox avec Scrollbar et filtrage
Pour une liste longue, une Scrollbar et un champ de recherche améliorent nettement l'utilisabilité :
import tkinter as tk
pays = ["Afghanistan", "Algérie", "Allemagne", "Belgique", "Brésil",
"Canada", "Chine", "Espagne", "France", "Inde", "Italie",
"Japon", "Maroc", "Mexique", "Pays-Bas", "Portugal",
"Royaume-Uni", "Russie", "Sénégal", "Tunisie", "USA"]
fenetre = tk.Tk()
fenetre.title("Recherche dans liste")
fenetre.geometry("280x310")
recherche = tk.StringVar()
def filtrer(*args):
terme = recherche.get().lower()
liste.delete(0, tk.END)
for p in pays:
if terme in p.lower():
liste.insert(tk.END, p)
recherche.trace_add("write", filtrer)
tk.Entry(fenetre, textvariable=recherche, width=28).pack(padx=15, pady=(12, 5))
frame = tk.Frame(fenetre)
frame.pack(padx=15, fill="both", expand=True)
scrollbar = tk.Scrollbar(frame)
scrollbar.pack(side="right", fill="y")
liste = tk.Listbox(frame, height=10, yscrollcommand=scrollbar.set, font=("Arial", 10))
liste.pack(side="left", fill="both", expand=True)
scrollbar.config(command=liste.yview)
filtrer() # remplir la liste au démarrage
fenetre.mainloop()
Le trace_add sur la StringVar déclenche le filtrage à chaque frappe dans le champ de recherche. La liste se met à jour instantanément sans bouton "Rechercher". Ce pattern est réutilisable tel quel pour filtrer n'importe quelle collection — y compris des données chargées depuis un fichier avec Pandas.
Par carabde | Mis à jour le 30 avril 2025