logo oujood
🔍

Choisir une couleur Tkinter (colorchooser)

colorchooser ouvre le sélecteur de couleur natif du système. Deux lignes suffisent pour récupérer une couleur hexadécimale ou RGB choisie par l'utilisateur.

OUJOOD.COM

Le module tkinter.colorchooser contient une seule fonction : askcolor(). Elle ouvre le sélecteur de couleur natif de la plateforme — la roue chromatique macOS, le sélecteur Windows ou la boîte de couleur GTK sous Linux — et retourne la couleur choisie sous deux formats simultanément.

Utilisation de base

📋 Copier le code

import tkinter as tk
from tkinter import colorchooser

fenetre = tk.Tk()
fenetre.title("Sélecteur de couleur")
fenetre.geometry("360x180")

def choisir_couleur():
    # askcolor() retourne ((r, g, b), '#rrggbb') ou (None, None) si annulation
    resultat = colorchooser.askcolor(
        title="Choisissez une couleur",
        color="#3498db"    # couleur présélectionnée à l'ouverture
    )
    rgb, hex_val = resultat

    if hex_val:  # None si l'utilisateur annule
        apercu.config(bg=hex_val)
        label_hex.config(text=f"Hex : {hex_val}")
        label_rgb.config(text=f"RGB : {int(rgb[0])}, {int(rgb[1])}, {int(rgb[2])}")

tk.Button(fenetre, text="Choisir une couleur", command=choisir_couleur).pack(pady=15)

apercu = tk.Label(fenetre, text="         ", bg="#3498db", width=10, height=2)
apercu.pack()

label_hex = tk.Label(fenetre, text="Hex : #3498db")
label_hex.pack(pady=4)
label_rgb = tk.Label(fenetre, text="RGB : 52, 152, 219")
label_rgb.pack()

fenetre.mainloop()

askcolor() retourne un tuple ((r, g, b), '#rrggbb'). Les composantes RGB sont des flottants — il faut les convertir avec int() pour obtenir des entiers. Si l'utilisateur ferme la boîte sans choisir, le retour est (None, None) — toujours vérifier hex_val avant de l'utiliser.

Appliquer la couleur à plusieurs widgets

Un cas d'usage courant : permettre à l'utilisateur de personnaliser les couleurs de l'interface :

📋 Copier le code

import tkinter as tk
from tkinter import colorchooser

fenetre = tk.Tk()
fenetre.title("Personnalisation")
fenetre.geometry("400x260")

couleurs = {
    "Fond":         tk.StringVar(value="#ffffff"),
    "Texte":        tk.StringVar(value="#212121"),
    "Accent":       tk.StringVar(value="#1565c0"),
}

def choisir(nom_couleur):
    var = couleurs[nom_couleur]
    resultat = colorchooser.askcolor(color=var.get(), title=f"Couleur — {nom_couleur}")
    _, hex_val = resultat
    if hex_val:
        var.set(hex_val)
        appliquer_theme()

def appliquer_theme():
    fond    = couleurs["Fond"].get()
    texte   = couleurs["Texte"].get()
    accent  = couleurs["Accent"].get()
    fenetre.configure(bg=fond)
    label_demo.configure(bg=fond, fg=texte)
    frame_btns.configure(bg=fond)
    for btn in btns_couleur:
        btn.configure(bg=fond)

frame_btns = tk.Frame(fenetre)
frame_btns.pack(pady=15)
btns_couleur = []

for nom in couleurs:
    btn = tk.Button(
        frame_btns,
        text=f"Couleur {nom}",
        command=lambda n=nom: choisir(n),
        width=16
    )
    btn.pack(pady=3)
    btns_couleur.append(btn)

label_demo = tk.Label(
    fenetre,
    text="Aperçu du thème personnalisé",
    font=("Arial", 12),
    pady=15
)
label_demo.pack(fill="x")

appliquer_theme()
fenetre.mainloop()

On stocke les couleurs dans des StringVar pour pouvoir les lire et les modifier facilement depuis n'importe quelle partie du code. Le lambda n=nom fixe la valeur de nom au moment de la création du bouton — sans ça, tous les boutons utiliseraient la dernière valeur de la boucle.

Pour une personnalisation encore plus poussée, le widget Scale en triple (RVB) décrit dans sa page respective est une alternative sans boîte de dialogue. Les deux approches peuvent coexister dans la même interface.

Par carabde | Mis à jour le 30 avril 2025