Ir al contenido

IDEAS PRÁCTICAS · ASIMOV INGENIERÍA

Eventos en Tkinter: del clic del mouse a tus funciones Python

Aprende a manejar eventos en Tkinter usando command y bind, con ejemplos de mouse, teclado y un mini‑proyecto que actualiza un Label dinámicamente.

Imagen ilustrativa · Brecht Corbeel / Unsplash.

Table of contents

No titles in the blog post

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.

Computadora portátil encendida en un escritorio
Imagen ilustrativa · AltumCode / Unsplash.

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 Event con 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

EventoDescripció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

EventoDescripció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 command siempre que el widget lo permita y no necesites datos del evento. Mantiene el código limpio y más rápido.
  • Prefiere bind para 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 a widget.focus_set() cuando sea necesario.
  • Depura con print(event) o pprint(vars(event)) para explorar los atributos disponibles.
  • Seguridad: nunca confíes en datos del usuario sin validar; por ejemplo, si usas event.char para construir comandos, sanitízalos.
  • Rendimiento: no asocies demasiados eventos a widgets que se actualizan con alta frecuencia (p.ej., <Motion>) sin throttling; usa after() 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.