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