logo oujood
🔍

Lier des événements avec bind() Tkinter

bind() ouvre l'accès à tous les événements que command= ne couvre pas : clavier, clic droit, double-clic, survol, focus. Un outil indispensable dès qu'on dépasse les boutons simples.

OUJOOD.COM

Le paramètre command d'un Button gère le clic gauche standard et rien d'autre. Dès qu'on veut réagir à une touche clavier, un double-clic, un survol ou un clic droit, c'est bind() qu'il faut utiliser. La méthode est disponible sur tous les widgets Tkinter.

Syntaxe de base

bind() prend deux arguments : une chaîne décrivant l'événement entre chevrons, et la fonction à appeler. Cette fonction reçoit automatiquement un objet event avec des informations sur ce qui s'est passé :

📋 Copier le code

import tkinter as tk

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

def sur_clic(event):
    label.config(text=f"Clic à x={event.x}, y={event.y}")

def sur_clic_droit(event):
    label.config(text="Clic droit détecté !")

def sur_double_clic(event):
    label.config(text="Double-clic !")

zone = tk.Label(fenetre, text="Cliquez ici", bg="#e3f2fd",
                width=30, height=5, font=("Arial", 12))
zone.pack(pady=20)

zone.bind("",        sur_clic)         # clic gauche
zone.bind("",        sur_clic_droit)   # clic droit
zone.bind("", sur_double_clic)  # double-clic gauche

label = tk.Label(fenetre, text="En attente...")
label.pack()

fenetre.mainloop()

L'objet event contient entre autres event.x et event.y (coordonnées du curseur dans le widget), event.x_root et event.y_root (coordonnées dans l'écran), event.widget (le widget source) et event.keysym pour les événements clavier.

Événements clavier

On peut écouter une touche précise ou n'importe quelle frappe sur un widget ou sur toute la fenêtre :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.title("Événements clavier")
fenetre.geometry("380x200")

def sur_touche(event):
    label_info.config(text=f"Touche : {event.keysym}  |  Caractère : {event.char!r}")

def sur_entree(event):
    label_info.config(text="Entrée validée !", fg="#2e7d32")

champ = tk.Entry(fenetre, width=30, font=("Arial", 12))
champ.pack(pady=20)
champ.focus_set()  # donne le focus au champ dès l'ouverture

# Toute frappe dans le champ
champ.bind("", sur_touche)

# Touche Entrée uniquement
champ.bind("", sur_entree)

label_info = tk.Label(fenetre, text="Tapez quelque chose...", fg="#555")
label_info.pack()

fenetre.mainloop()

<Key> capte toutes les frappes. <Return> capte la touche Entrée. On peut cibler n'importe quelle touche par son nom : <Escape>, <space>, <Tab>, <F1>... Les modificateurs se combinent avec un tiret : <Control-s> pour Ctrl+S, <Shift-Tab> pour Maj+Tab.

Événements de survol et de focus

Utiles pour des retours visuels dynamiques sans JavaScript — l'équivalent d'un :hover CSS :

📋 Copier le code

import tkinter as tk

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

def entrer(event):
    event.widget.config(bg="#1565c0", fg="white")

def sortir(event):
    event.widget.config(bg="#e3f2fd", fg="#1565c0")

for texte in ["Option A", "Option B", "Option C"]:
    btn = tk.Label(
        fenetre, text=texte,
        bg="#e3f2fd", fg="#1565c0",
        font=("Arial", 12), padx=20, pady=8,
        cursor="hand2"
    )
    btn.pack(fill="x", padx=30, pady=4)
    btn.bind("", entrer)  # souris entre dans le widget
    btn.bind("", sortir)  # souris quitte le widget

fenetre.mainloop()

event.widget retourne le widget qui a déclenché l'événement — ici, le Label survolé. Cela permet d'utiliser les mêmes fonctions entrer et sortir pour tous les labels sans les dupliquer.

La combinaison bind() + callbacks bien structurés couvre la grande majorité des besoins d'interaction. Pour les raccourcis clavier globaux qui fonctionnent même quand aucun widget n'a le focus, on peut binder directement la fenêtre : fenetre.bind("<Control-q>", quitter).

Par carabde | Mis à jour le 30 avril 2025