Eventos en Tkinter: del clic del mouse a tus funciones Python
Tkinter es la librería estándar de Python para crear interfaces gráficas. Dominar sus eventos permite reaccionar a clicks, pulsaciones de teclado y mucho más. En este artículo descubrirás la diferencia entre command= y bind(), los eventos más habituales y cómo extraer información útil del objeto Event.
1. ¿Qué hace command=?
El argumento command es un atajo específico de algunos widgets (botón, menú, checkbutton, etc.). Cuando el usuario activa el widget, Tkinter llama automáticamente a la función asignada, sin pasarle ningún argumento.
import tkinter as tk
def saludar():
print("¡Hola!")
root = tk.Tk()
btn = tk.Button(root, text="Saludar", command=saludar)
btn.pack(pady=10)
root.mainloop()
Ventajas:
- Sintaxis concisa.
- Ideal para acciones simples que no requieren datos del evento.
2. ¿Qué hace bind()?
El método bind() asocia cualquier evento de Tk (mouse, teclado, foco, redimensionado, etc.) a una función. La función recibe un objeto Event con información contextual (coordenadas, tecla pulsada, widget origen, …).
def on_click(event):
print(f"Clic en ({event.x}, {event.y})")
btn.bind("<Button-1>", on_click) # botón izquierdo del ratón
3. Comparativa rápida
command=
- Solo para widgets que lo admiten.
- No recibe objeto
Event. - Se ejecuta al activar el widget (click, selección, etc.).
- Ideal para lógica de negocio simple.
bind()
- Disponible para cualquier widget.
- Recibe
Eventcon datos (x, y, keysym, …). - Permite manejar varios tipos de eventos.
- Perfecto para interacción avanzada y depuración.
4. Eventos de ratón más usados
| Evento | Descripción |
|---|---|
<Button-1> | Clic con el botón izquierdo. |
<Button-2> | Clic con el botón central (rueda). |
<Button-3> | Clic con el botón derecho. |
<Double-Button-1> | Doble‑clic izquierdo. |
<Motion> | Movimiento del ratón dentro del widget. |
5. Eventos de teclado más usados
| Evento | Descripción |
|---|---|
<Key> | Cualquier tecla pulsada. |
<KeyPress-A> | Tecla "A" específica. |
<Return> | Tecla Enter/Return. |
<Escape> | Tecla Esc. |
<Control-c> | Ctrl + C (copiar, etc.). |
6. Obtener información del Event
El objeto Event contiene atributos útiles:
- event.x / event.y: coordenadas relativas al widget.
- event.x_root / event.y_root: coordenadas en la pantalla.
- event.widget: referencia al widget que recibió el evento.
- event.keysym: nombre simbólico de la tecla ("Return", "a", "Escape").
- event.char: carácter Unicode generado (útil para texto).
7. Mini‑ejemplo práctico
En este ejemplo se muestra cómo cambiar el texto de un Label al pulsar un Button (usando command) o al hacer clic en un Canvas (usando bind). Además, se imprimen las coordenadas del click.
import tkinter as tk
def cambiar_con_boton():
mensaje.set("Texto actualizado con command")
def cambiar_con_click(event):
mensaje.set(f"Clic en ({event.x}, {event.y}) – bind")
print(f"Coordenadas del click: x={event.x}, y={event.y}")
root = tk.Tk()
root.title("Eventos: command vs bind")
mensaje = tk.StringVar(value="Texto inicial")
label = tk.Label(root, textvariable=mensaje, font=("Arial", 14))
label.pack(pady=10)
btn = tk.Button(root, text="Cambiar con command", command=cambiar_con_boton)
btn.pack(pady=5)
canvas = tk.Canvas(root, width=300, height=150, bg="#f0f0f0")
canvas.pack(pady=10)
canvas.create_text(150, 75, text="Haz clic aquí", font=("Arial", 12))
canvas.bind("", cambiar_con_click)
root.mainloop()
Prueba el programa: el botón modifica el Label sin necesidad de datos del evento, mientras que el canvas lo hace gracias a bind y muestra la posición exacta del click.
8. Buenas prácticas y troubleshooting
- Usa
commandsiempre que el widget lo permita y no necesites datos del evento. Mantiene el código limpio y más rápido. - Prefiere
bindpara interacciones avanzadas: arrastrar‑soltar, gestos, teclas de acceso rápido, etc. - Desvincula eventos que ya no necesites:
widget.unbind('<Event>')para evitar fugas de memoria. - Evita capturar
<Key>en widgets que no reciben foco. Llama awidget.focus_set()cuando sea necesario. - Depura con
print(event)opprint(vars(event))para explorar los atributos disponibles. - Seguridad: nunca confíes en datos del usuario sin validar; por ejemplo, si usas
event.charpara construir comandos, sanitízalos. - Rendimiento: no asocies demasiados eventos a widgets que se actualizan con alta frecuencia (p.ej.,
<Motion>) sin throttling; usaafter()para limitar la frecuencia.
9. Conclusión
Dominar command y bind te brinda un control total sobre la interacción del usuario en Tkinter. command es la vía rápida para acciones simples; bind abre la puerta a una interacción rica y contextual, permitiendo leer coordenadas, teclas y mucho más. Con los ejemplos y buenas prácticas presentados, ya puedes crear interfaces más dinámicas, seguras y optimizadas.