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 :
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 :
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 Label — font, fg, bg — avec quelques ajouts propres aux boutons :
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" :
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