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() :
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 :
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" :
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