logo oujood
🔍

Le widget Button Tkinter

Button déclenche une action au clic. Voici comment le créer, le styliser, le désactiver et lui associer une fonction proprement.

OUJOOD.COM

Un bouton sans action ne sert à rien — c'est la différence fondamentale entre Button et Label. Le paramètre command est ce qui relie le widget à votre code. Tout le reste (couleur, taille, état) est secondaire.

Créer un bouton et lui associer une fonction

La façon la plus directe :

📋 Copier le code

import tkinter as tk

def dire_bonjour():
    print("Bonjour depuis Tkinter !")

fenetre = tk.Tk()
fenetre.geometry("300x120")

btn = tk.Button(fenetre, text="Dire bonjour", command=dire_bonjour)
btn.pack(pady=30)

fenetre.mainloop()

Point important : on passe la référence à la fonction — command=dire_bonjour — sans les parenthèses. Écrire command=dire_bonjour() appellerait la fonction immédiatement au moment de la création du bouton, pas au clic. C'est une erreur fréquente.

Passer des arguments à la fonction

Quand la fonction attend des paramètres, lambda est la solution habituelle :

📋 Copier le code

import tkinter as tk

def saluer(nom):
    label_msg.config(text=f"Bonjour, {nom} !")

fenetre = tk.Tk()
fenetre.geometry("320x150")

label_msg = tk.Label(fenetre, text="", font=("Arial", 12))
label_msg.pack(pady=15)

# lambda reporte l'appel au moment du clic
tk.Button(fenetre, text="Saluer Alice", command=lambda: saluer("Alice")).pack(side="left", padx=20)
tk.Button(fenetre, text="Saluer Bob",   command=lambda: saluer("Bob")).pack(side="left", padx=5)

fenetre.mainloop()

On utilise lambda pour envelopper l'appel avec ses arguments. La fonction saluer ne sera appelée qu'au clic, avec la bonne valeur.

Personnaliser l'apparence

Les options de style sont similaires à celles du Labelfont, fg, bg — avec quelques ajouts propres aux boutons :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.geometry("350x180")
fenetre.configure(bg="#f5f5f5")

btn_valider = tk.Button(
    fenetre,
    text="Valider",
    font=("Arial", 12, "bold"),
    fg="white",
    bg="#27ae60",           # couleur de fond normale
    activebackground="#1e8449",  # couleur au survol / clic
    activeforeground="white",
    padx=20,
    pady=8,
    relief="flat",
    cursor="hand2"          # curseur pointeur au survol
)
btn_valider.pack(pady=30)

btn_annuler = tk.Button(
    fenetre,
    text="Annuler",
    font=("Arial", 12),
    fg="#555",
    bg="#ddd",
    activebackground="#bbb",
    padx=20,
    pady=8,
    relief="flat"
)
btn_annuler.pack()

fenetre.mainloop()

activebackground et activeforeground définissent l'apparence au moment où le bouton est enfoncé. cursor="hand2" change le curseur en main pointante au survol, ce qui améliore l'expérience utilisateur sans effort.

Désactiver et réactiver un bouton

Le paramètre state contrôle si un bouton est cliquable. Trois valeurs possibles : "normal", "active" et "disabled" :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.geometry("320x150")

def basculer():
    if btn_action["state"] == "normal":
        btn_action.config(state="disabled", text="Action (désactivé)")
        btn_toggle.config(text="Réactiver")
    else:
        btn_action.config(state="normal", text="Action")
        btn_toggle.config(text="Désactiver")

btn_action = tk.Button(fenetre, text="Action", width=18)
btn_action.pack(pady=15)

btn_toggle = tk.Button(fenetre, text="Désactiver", command=basculer)
btn_toggle.pack()

fenetre.mainloop()

Un cas typique : désactiver le bouton "Envoyer" tant que le formulaire n'est pas complet, puis le réactiver dès que tous les champs sont remplis. Pour gérer ça proprement, on utilise souvent une StringVar avec un trace pour surveiller les champs en temps réel.

Pour aller plus loin sur la gestion des clics et des événements, la page sur les fonctions callback et celle sur bind() couvrent les cas plus avancés.

Par carabde | Mis à jour le 30 avril 2025