logo oujood
🔍

Le widget Scale Tkinter

Scale est le curseur glissant de Tkinter. Il permet de sélectionner une valeur numérique dans une plage définie, avec ou sans affichage de la valeur courante.

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 :

📋 Copier le code

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 :

📋 Copier le code

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 :

📋 Copier le code

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