logo oujood
🔍

Le widget Listbox Tkinter

Listbox affiche une liste d'éléments sélectionnables. Simple à mettre en place, il supporte la sélection simple ou multiple et s'associe naturellement à une Scrollbar.

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

📋 Copier le code

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 :

📋 Copier le code

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é :

📋 Copier le code

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