logo oujood
🔍

Les thèmes ttk Tkinter

ttk.Style contrôle l'apparence de tous les widgets ttk. Quelques lignes suffisent pour changer de thème ou créer un style personnalisé cohérent sur toute l'interface.

OUJOOD.COM

Les widgets ttk ne répondent pas aux paramètres bg et fg classiques. Leur apparence passe par ttk.Style, un objet qui centralise tous les réglages visuels. Ce système est plus rigide que le paramétrage direct, mais il garantit une cohérence visuelle sur toute l'interface.

Les thèmes disponibles

Tkinter inclut plusieurs thèmes selon la plateforme. On les liste et on en applique un avec theme_use() :

📋 Copier le code

import tkinter as tk
from tkinter import ttk

fenetre = tk.Tk()
fenetre.geometry("400x280")

style = ttk.Style()

# Lister les thèmes disponibles sur ce système
print("Thèmes disponibles :", style.theme_names())
# Windows : ('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
# macOS   : ('aqua', 'clam', 'alt', 'default', 'classic')
# Linux   : ('clam', 'alt', 'default', 'classic')

# Appliquer un thème — 'clam' est le plus cohérent sur toutes les plateformes
style.theme_use("clam")

notebook = ttk.Notebook(fenetre)
notebook.pack(fill="both", expand=True, padx=10, pady=10)

for nom_theme in style.theme_names():
    frame = tk.Frame(notebook)
    notebook.add(frame, text=f" {nom_theme} ")
    ttk.Button(frame, text=f"Thème : {nom_theme}",
               command=lambda t=nom_theme: style.theme_use(t)).pack(pady=30)

fenetre.mainloop()

Le thème "clam" est souvent le point de départ pour une personnalisation poussée — il réagit mieux à style.configure() que les thèmes natifs comme "vista" ou "aqua" qui ont des comportements plus restrictifs.

Personnaliser un style existant

style.configure() modifie un style par son nom. Le nom d'un style ttk est toujours de la forme "NomWidget" avec un T majuscule :

📋 Copier le code

import tkinter as tk
from tkinter import ttk

fenetre = tk.Tk()
fenetre.geometry("380x220")

style = ttk.Style()
style.theme_use("clam")

# Modifier le style global de TButton
style.configure(
    "TButton",
    font=("Arial", 11),
    padding=8,
    background="#1565c0",
    foreground="white",
    borderwidth=0
)

# État au survol / clic
style.map(
    "TButton",
    background=[("active", "#0d47a1"), ("disabled", "#bdbdbd")],
    foreground=[("disabled", "#757575")]
)

style.configure("TLabel", font=("Arial", 11), background="#f5f5f5")
style.configure("TFrame", background="#f5f5f5")
fenetre.configure(bg="#f5f5f5")

ttk.Label(fenetre, text="Interface avec style personnalisé").pack(pady=20)
ttk.Button(fenetre, text="Bouton principal").pack(pady=5)
ttk.Button(fenetre, text="Bouton désactivé", state="disabled").pack(pady=5)

fenetre.mainloop()

style.map() définit les états interactifs — "active" pour le survol/clic, "disabled" pour l'état désactivé, "focus" pour l'état focalisé. Chaque état reçoit une liste de tuples (état, valeur).

Créer un style nommé personnalisé

Pour éviter de modifier le style global, on crée des variantes nommées avec le préfixe "Nom.TWidget" :

📋 Copier le code

import tkinter as tk
from tkinter import ttk

fenetre = tk.Tk()
fenetre.geometry("340x200")

style = ttk.Style()
style.theme_use("clam")

# Styles nommés — n'affectent pas les autres boutons
style.configure("Vert.TButton",  background="#2e7d32", foreground="white", padding=8)
style.configure("Rouge.TButton", background="#c62828", foreground="white", padding=8)
style.configure("Gris.TButton",  background="#757575", foreground="white", padding=8)

style.map("Vert.TButton",  background=[("active", "#1b5e20")])
style.map("Rouge.TButton", background=[("active", "#b71c1c")])

frame = tk.Frame(fenetre)
frame.pack(expand=True)

ttk.Button(frame, text="Valider",   style="Vert.TButton").pack(side="left", padx=8)
ttk.Button(frame, text="Supprimer", style="Rouge.TButton").pack(side="left", padx=8)
ttk.Button(frame, text="Annuler",   style="Gris.TButton").pack(side="left", padx=8)

fenetre.mainloop()

La convention de nommage "Prefixe.TWidget" est importante — Tkinter reconnaît le type de widget grâce à la partie après le point. "Vert.TButton" est un style de bouton, "Grand.TLabel" est un style de label. On applique le style avec le paramètre style="Vert.TButton" dans le constructeur du widget.

Par carabde | Mis à jour le 30 avril 2025