Entendiendo el Evento `focusin` en el Widget `Entry()` de Tkinter


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.



¿Qué es el Widget `Entry()` en 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.



¿Qué es el Evento `focusin`?

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.



Sintaxis para Vincular el Evento `focusin`

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.



Ejemplo de Uso del Evento `focusin`

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()



Descripción del código

- `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.



Parámetros del Evento `focusin`

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`.



Métodos Útiles con `Entry()` y `focusin`

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



Ejemplo Completo de Uso de `focusin` con Métodos de `Entry()`

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.



Otros Eventos Relacionados con `focusin`

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)



Hay mucho más contenido sobre Python para ti

Puedes conocer todo el contenido que comparto en mi perfil de LinkedIn

 

Puedes descargar GRATIS mi manual completo en pdf de Python Rápido


image


This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.