El evento `focusin` en Tkinter es clave para manejar la interacción del usuario con los widgets, especialmente con el campo de entrada `Entry()`. Este evento se dispara cuando un widget, como un campo de entrada de texto, gana el foco, es decir, cuando el usuario hace clic en él o lo selecciona mediante el teclado (con la tecla `Tab`, por ejemplo).
En este post, te explicaré qué es el evento `focusin`, cómo usarlo en un widget `Entry()`, y qué otros métodos y parámetros puedes utilizar para mejorar la interactividad de tus aplicaciones de Tkinter.
El `Entry()` es uno de los widgets más utilizados en Tkinter para crear campos de entrada de texto. Es el equivalente a una caja de texto en otros entornos de desarrollo y permite al usuario ingresar y editar una sola línea de texto.
Si quieres conocer todos los detalles, parámetros y métodos de Entry() puedes visitar este artículo especialmente dedicado a este objeto.
El evento `focusin` en Tkinter ocurre cuando un widget recibe el foco, ya sea porque el usuario hizo clic sobre él, lo seleccionó con el teclado, o el programa lo estableció como foco activo. Este evento es útil para agregar efectos interactivos o realizar acciones específicas cuando el usuario empieza a interactuar con el campo de texto, como cambiar el estilo del widget o limpiar el texto predeterminado.
Puedes vincular el evento `focusin` a un widget como `Entry()` utilizando el método `bind()`, que permite asociar eventos con funciones.
widget.bind('<FocusIn>', handler)
- `widget`: El widget con el que quieres asociar el evento, en este caso, un `Entry`.
- `<FocusIn>`: El nombre del evento en Tkinter. Los eventos en Tkinter se especifican dentro de ángulos (`<>`).
- `handler`: Es la función que se ejecutará cuando el evento ocurra.
Aquí tienes un ejemplo en el que se cambia el color de fondo del campo `Entry()` cuando gana el foco.
import tkinter as tk
def on_focus_in(event):
event.widget.config(bg='lightyellow')
def on_focus_out(event):
event.widget.config(bg='white')
ventana = tk.Tk()
ventana.title("Ejemplo con FocusIn")
# Crear el widget Entry
entrada = tk.Entry(ventana)
entry.pack(padx=10, pady=10)
# Vincular los eventos de focusin y focusout
entrada.bind('<FocusIn>', on_focus_in)
entrada.bind('<FocusOut>', on_focus_out)
ventana.mainloop()
- `on_focus_in()`: Esta función se llama cuando el campo de entrada recibe el foco, cambiando su color de fondo a `lightyellow`.
- `on_focus_out()`: Esta función restaura el color de fondo a `white` cuando el campo de entrada pierde el foco.
Este comportamiento es típico en formularios interactivos, donde se resalta el campo activo.
Cuando utilizas `bind()` para vincular un evento como `focusin` a un widget, el evento en sí pasa información adicional a la función que maneja el evento. Esta información se recibe como un objeto de evento que contiene datos útiles sobre la interacción.
Los principales atributos del objeto evento son:
1. `widget`: Hace referencia al widget que activó el evento. En este caso, es el campo `Entry()`.
def on_focus_in(event):
print(event.widget) # Devuelve el widget que recibió el foco
2. `type`: El tipo de evento que ocurrió. En este caso, será `FocusIn`.
def on_focus_in(event):
print(event.type) # Muestra "FocusIn"
3. `x` y `y`: Coordenadas del cursor en el widget cuando ocurre el evento.
def on_focus_in(event):
print(event.x, event.y) # Coordenadas del mouse cuando ocurre el evento
4. `char`: Si el evento implica la entrada de un carácter, este atributo contiene el carácter ingresado. Para `focusin`, normalmente no es relevante, pero es útil en otros eventos como `KeyPress`.
El widget `Entry()` tiene varios métodos que puedes utilizar junto con el evento `focusin` para mejorar la experiencia del usuario.
1. `get()`: Obtiene el texto actual dentro del campo `Entry`.
def on_focus_in(event):
contenido = event.widget.get()
print(contenido)
2. `delete(first, last=None)`: Elimina el contenido del campo `Entry`. Puedes especificar un índice de inicio y fin, o eliminar todo el contenido.
def on_focus_in(event):
event.widget.delete(0, tk.END) # Elimina todo el texto cuando se enfoca el campo
3. `insert(index, string)`: Inserta texto en una posición específica dentro del `Entry`.
def on_focus_in(event):
event.widget.insert(0, 'Escribe aquí...')
4. `config()` o `configure()`: Cambia las propiedades del campo de entrada (como el color de fondo, el tamaño de la fuente, etc.).
def on_focus_in(event):
event.widget.config(fg='blue')
5. `focus_set()`: Asigna el foco a un widget de manera programática.
entry.focus_set() # Establece el foco en el campo de entrada
Aquí tienes un ejemplo más completo que demuestra cómo usar los métodos `get()`, `delete()`, e `insert()` en combinación con el evento `focusin`:
import tkinter as tk
def on_focus_in(event):
# Elimina el texto predeterminado si aún está en el campo
if event.widget.get() == "Escribe aquí...":
event.widget.delete(0, tk.END)
event.widget.config(fg='black')
def on_focus_out(event):
# Si el campo está vacío al perder el foco, inserta el texto predeterminado
if event.widget.get() == "":
event.widget.insert(0, "Escribe aquí...")
event.widget.config(fg='grey')
ventana = tk.Tk()
ventana.title("Ejemplo Completo con FocusIn y FocusOut")
# Crear el campo de entrada con texto predeterminado
entrada = tk.Entry(ventana, fg='grey')
entrada.insert(0, "Escribe aquí...")
entrada.pack(padx=10, pady=10)
# Vincular los eventos focusin y focusout
entrada.bind('<FocusIn>', on_focus_in)
entrada.bind('<FocusOut>', on_focus_out)
ventana.mainloop()
Descripción del comportamiento:
- Cuando el campo recibe el foco (`focusin`), el texto predeterminado se elimina, y el color del texto cambia a negro.
- Cuando el campo pierde el foco (`focusout`) y está vacío, se vuelve a insertar el texto predeterminado con color gris.
Este es un comportamiento típico de los formularios donde los campos tienen sugerencias que desaparecen cuando el usuario comienza a escribir.
Además de `focusin`, hay otros eventos relacionados que pueden ser útiles:
1. `FocusOut`: Se dispara cuando el widget pierde el foco.
widget.bind('<FocusOut>', handler)
2. `<Tab>`: Se puede utilizar para capturar cuando el usuario navega por los widgets con la tecla `Tab`.
widget.bind('<Tab>', handler)
3. `<Return>`: Captura cuando el usuario presiona la tecla Enter en el campo de entrada.
widget.bind('<Return>', handler)
Puedes conocer todo el contenido que comparto en mi perfil de LinkedIn
Puedes descargar GRATIS mi manual completo en pdf de Python Rápido