logo oujood
🔍

Les widgets ttk Tkinter

Le module ttk propose des versions thémées des widgets classiques, plus un ensemble de widgets exclusifs. Ils s'intègrent mieux au système d'exploitation et supportent les thèmes.

OUJOOD.COM

Le module tkinter.ttk (Themed Tk) est une surcouche à Tkinter qui propose deux choses : des versions améliorées des widgets classiques qui adoptent l'apparence native du système d'exploitation, et des widgets exclusifs absents du module classique — Notebook, Treeview, Progressbar, Separator, Combobox.

Widgets classiques vs ttk

La différence visuelle est immédiate sur Windows et macOS — les widgets ttk épousent le style natif de la plateforme :

📋 Copier le code

import tkinter as tk
from tkinter import ttk

fenetre = tk.Tk()
fenetre.title("tk vs ttk")
fenetre.geometry("380x200")

frame_gauche = tk.Frame(fenetre, bd=1, relief="groove")
frame_gauche.pack(side="left", fill="both", expand=True, padx=10, pady=10)
frame_droite = tk.Frame(fenetre, bd=1, relief="groove")
frame_droite.pack(side="left", fill="both", expand=True, padx=10, pady=10)

tk.Label(frame_gauche, text="Widgets tk", font=("Arial", 9, "bold")).pack(pady=4)
tk.Button(frame_gauche,  text="Button").pack(pady=3)
tk.Entry(frame_gauche,   width=14).pack(pady=3)
tk.Checkbutton(frame_gauche, text="Option").pack(pady=3)

tk.Label(frame_droite, text="Widgets ttk", font=("Arial", 9, "bold")).pack(pady=4)
ttk.Button(frame_droite,     text="Button").pack(pady=3)
ttk.Entry(frame_droite,      width=14).pack(pady=3)
ttk.Checkbutton(frame_droite, text="Option").pack(pady=3)

fenetre.mainloop()

Une différence importante : les widgets ttk ne supportent pas directement les paramètres de style comme bg, fg ou font dans le constructeur. Ces attributs passent par ttk.Style — détaillé dans la page sur les thèmes ttk.

Notebook — onglets

ttk.Notebook est le widget d'onglets, absent du module classique :

📋 Copier le code

import tkinter as tk
from tkinter import ttk

fenetre = tk.Tk()
fenetre.title("Notebook")
fenetre.geometry("420x280")

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

onglet1 = tk.Frame(notebook, bg="#e3f2fd")
onglet2 = tk.Frame(notebook, bg="#e8f5e9")
onglet3 = tk.Frame(notebook, bg="#fff8e1")

notebook.add(onglet1, text="  Général  ")
notebook.add(onglet2, text="  Avancé  ")
notebook.add(onglet3, text="  Aide  ")

tk.Label(onglet1, text="Contenu — onglet Général",
         bg="#e3f2fd", font=("Arial", 12)).pack(expand=True)
tk.Label(onglet2, text="Contenu — onglet Avancé",
         bg="#e8f5e9", font=("Arial", 12)).pack(expand=True)
tk.Label(onglet3, text="Contenu — onglet Aide",
         bg="#fff8e1", font=("Arial", 12)).pack(expand=True)

def sur_changement(event):
    index = notebook.index(notebook.select())
    print(f"Onglet actif : {index}")

notebook.bind("<>", sur_changement)
fenetre.mainloop()

Chaque onglet est un Frame ordinaire passé à notebook.add(). L'événement <<NotebookTabChanged>> se déclenche à chaque changement. Pour naviguer par programme : notebook.select(index).

Separator et LabelFrame ttk

📋 Copier le code

import tkinter as tk
from tkinter import ttk

fenetre = tk.Tk()
fenetre.geometry("360x260")

frame_info = ttk.LabelFrame(fenetre, text="Informations personnelles", padding=10)
frame_info.pack(fill="x", padx=15, pady=10)

ttk.Label(frame_info, text="Nom :").grid(row=0, column=0, sticky="e", pady=3)
ttk.Entry(frame_info, width=20).grid(row=0, column=1, padx=8)
ttk.Label(frame_info, text="Email :").grid(row=1, column=0, sticky="e", pady=3)
ttk.Entry(frame_info, width=20).grid(row=1, column=1, padx=8)

# Ligne de séparation horizontale
ttk.Separator(fenetre, orient="horizontal").pack(fill="x", padx=15, pady=5)

frame_opt = ttk.LabelFrame(fenetre, text="Options", padding=10)
frame_opt.pack(fill="x", padx=15)

ttk.Checkbutton(frame_opt, text="Recevoir les notifications").pack(anchor="w")
ttk.Checkbutton(frame_opt, text="Profil public").pack(anchor="w")

ttk.Button(fenetre, text="Enregistrer").pack(pady=12)
fenetre.mainloop()

ttk.Separator trace une ligne de séparation horizontale ou verticale. ttk.LabelFrame est l'équivalent ttk du Frame classique avec un titre intégré dans la bordure. Le paramètre padding ajoute un espace interne. Pour personnaliser les couleurs et polices des widgets ttk, la page sur les thèmes ttk détaille ttk.Style.

Par carabde | Mis à jour le 30 avril 2025