logo oujood
🔍

Le widget Spinbox Tkinter

Spinbox combine un champ de saisie et deux flèches pour incrémenter ou décrémenter une valeur. Idéal pour les quantités, les âges ou tout paramètre numérique borné.

OUJOOD.COM

Le widget Spinbox ressemble à un Entry avec deux petites flèches sur le côté. L'utilisateur peut taper une valeur directement ou cliquer sur les flèches pour monter ou descendre. C'est le bon choix quand la valeur doit rester dans une plage définie — une quantité, une année, un pourcentage.

Spinbox numérique avec bornes

Les paramètres from_ et to définissent les limites. Notez le underscore dans from_from étant un mot réservé Python :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.title("Spinbox numérique")
fenetre.geometry("320x160")

tk.Label(fenetre, text="Quantité :").pack(pady=(20, 4))

spinbox = tk.Spinbox(
    fenetre,
    from_=1,        # valeur minimale
    to=100,         # valeur maximale
    width=8,
    font=("Arial", 12)
)
spinbox.pack()

def afficher():
    label_val.config(text=f"Valeur sélectionnée : {spinbox.get()}")

tk.Button(fenetre, text="Valider", command=afficher).pack(pady=10)
label_val = tk.Label(fenetre, text="")
label_val.pack()

fenetre.mainloop()

Comme pour Entry, la méthode get() retourne une chaîne de caractères — pas un entier. Pensez à convertir avec int(spinbox.get()) ou float(spinbox.get()) si vous faites des calculs.

Spinbox avec liste de valeurs

Au lieu d'une plage numérique, on peut fournir une liste de valeurs fixes avec le paramètre values :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.title("Spinbox liste")
fenetre.geometry("320x180")

mois = ("Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
        "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")

tk.Label(fenetre, text="Mois de naissance :").pack(pady=(20, 4))

spinbox_mois = tk.Spinbox(
    fenetre,
    values=mois,    # liste de valeurs texte
    width=12,
    font=("Arial", 11),
    state="readonly"  # empêche la saisie libre
)
spinbox_mois.pack()

def afficher():
    label_val.config(text=f"Mois choisi : {spinbox_mois.get()}")

tk.Button(fenetre, text="Confirmer", command=afficher).pack(pady=10)
label_val = tk.Label(fenetre, text="")
label_val.pack()

fenetre.mainloop()

state="readonly" empêche l'utilisateur de taper une valeur qui ne figure pas dans la liste — les flèches restent actives mais la frappe directe est bloquée. C'est le comportement attendu pour une liste fermée, comparable à ce que fait Combobox en mode readonly.

Surveiller la valeur avec StringVar

Pour réagir à chaque changement de valeur sans attendre un clic sur un bouton, on lie le Spinbox à une StringVar :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.geometry("320x150")

valeur = tk.StringVar(value="1")

def sur_changement(*args):
    try:
        v = int(valeur.get())
        label_info.config(text=f"Prix total : {v * 9.90:.2f} €")
    except ValueError:
        label_info.config(text="Valeur invalide")

valeur.trace_add("write", sur_changement)

tk.Label(fenetre, text="Nombre d'articles :").pack(pady=(15, 4))

spinbox = tk.Spinbox(fenetre, from_=1, to=50, textvariable=valeur, width=6)
spinbox.pack()

label_info = tk.Label(fenetre, text="Prix total : 9.90 €", font=("Arial", 11))
label_info.pack(pady=10)

fenetre.mainloop()

Le calcul du prix total se met à jour à chaque flèche ou à chaque frappe. Le bloc try/except protège contre les saisies intermédiaires invalides — quand l'utilisateur efface le champ avant de retaper une valeur, get() retourne une chaîne vide que int() ne peut pas convertir.

Si vous cherchez un widget similaire mais avec un menu déroulant au lieu de flèches, regardez du côté du Combobox ttk. Pour un curseur glissant, le widget Scale est plus adapté.

Par carabde | Mis à jour le 30 avril 2025