OUJOOD.COM
Le widget Scale est un curseur glissant qui permet à l'utilisateur de choisir une valeur numérique dans une plage définie. C'est l'alternative graphique au Spinbox : là où Spinbox convient aux valeurs précises saisies manuellement, Scale convient aux réglages continus — volume, luminosité, zoom, opacité.
Scale horizontal et vertical
Le paramètre orient contrôle l'orientation :
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Scale — base")
fenetre.geometry("360x220")
tk.Label(fenetre, text="Volume :").pack(pady=(20, 2))
# Scale horizontal — défaut
scale_h = tk.Scale(
fenetre,
from_=0,
to=100,
orient=tk.HORIZONTAL,
length=280,
tickinterval=25, # marques tous les 25 points
resolution=1 # pas de 1
)
scale_h.set(50) # valeur initiale
scale_h.pack()
tk.Label(fenetre, text="Zoom :").pack(pady=(15, 2))
# Scale vertical
scale_v = tk.Scale(
fenetre,
from_=200,
to=10, # from_ > to pour inverser (haut = valeur max)
orient=tk.VERTICAL,
length=80,
resolution=10
)
scale_v.set(100)
scale_v.pack()
fenetre.mainloop()
Passer from_ supérieur à to inverse la direction du curseur — utile pour un Scale vertical où le haut devrait correspondre à la valeur maximale. tickinterval affiche des marques de graduation sous le curseur. resolution définit le pas minimal entre deux valeurs.
Lire la valeur en temps réel
Deux approches : le paramètre command ou une DoubleVar liée via variable :
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Scale en temps réel")
fenetre.geometry("380x200")
valeur = tk.DoubleVar()
def sur_changement(val):
# val est la valeur courante sous forme de chaîne
label_val.config(text=f"Valeur : {float(val):.1f}")
# Exemple : modifier la taille du texte en direct
taille = max(8, int(float(val) / 4))
label_demo.config(font=("Arial", taille))
scale = tk.Scale(
fenetre,
from_=0,
to=100,
orient=tk.HORIZONTAL,
length=320,
variable=valeur,
command=sur_changement,
showvalue=False # masque l'affichage de la valeur sur le curseur
)
scale.set(40)
scale.pack(padx=20, pady=15)
label_val = tk.Label(fenetre, text="Valeur : 40.0")
label_val.pack()
label_demo = tk.Label(fenetre, text="Texte de démonstration", font=("Arial", 10))
label_demo.pack(pady=10)
fenetre.mainloop()
Le callback command reçoit la valeur courante sous forme de chaîne — il faut la convertir avec float() ou int() avant de l'utiliser dans des calculs. showvalue=False masque l'étiquette de valeur intégrée au curseur, ce qui est souvent préférable quand on affiche la valeur ailleurs dans l'interface.
Exemple pratique — mélangeur de couleur RVB
Un cas d'usage courant : trois curseurs pour composer une couleur en temps réel :
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Mélangeur RVB")
fenetre.geometry("360x260")
canaux = {"R": tk.IntVar(value=128),
"G": tk.IntVar(value=128),
"B": tk.IntVar(value=128)}
apercu = tk.Label(fenetre, text="", width=30, height=3)
apercu.pack(pady=10)
def mettre_a_jour(*args):
r = canaux["R"].get()
g = canaux["G"].get()
b = canaux["B"].get()
hex_col = f"#{r:02x}{g:02x}{b:02x}"
apercu.config(bg=hex_col, text=hex_col)
couleurs_label = {"R": "#ef5350", "G": "#66bb6a", "B": "#42a5f5"}
for canal, var in canaux.items():
frame = tk.Frame(fenetre)
frame.pack(fill="x", padx=20, pady=2)
tk.Label(frame, text=canal, width=2, fg=couleurs_label[canal],
font=("Arial", 11, "bold")).pack(side="left")
tk.Scale(frame, from_=0, to=255, orient=tk.HORIZONTAL,
variable=var, command=mettre_a_jour,
length=280, showvalue=False).pack(side="left")
tk.Label(frame, textvariable=var, width=4).pack(side="left")
mettre_a_jour()
fenetre.mainloop()
Chaque curseur est lié à une IntVar et appelle mettre_a_jour() à chaque déplacement. La couleur hexadécimale est calculée avec le formatage :02x qui garantit deux chiffres hexadécimaux par canal. Ce type d'interface se retrouve souvent dans des outils qui intègrent Matplotlib pour la visualisation.
Par carabde | Mis à jour le 30 avril 2025