Entrada

Entry Widget

Widget Entry de Tkinter

En tcl/tk esta representado a través de la clase ttk.Entry, que a su vez hereda la funcionalidad de un control más primitivo como tk.Entry.

Crear un Widget Entry

Para crear una caja de texto, entonces, creamos una instancia de la primera clase:

1
2
3
4
5
6
7
8
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.config(width=300, height=400)
entry = ttk.Entry(root)
entry.place(x=50, y=50) # posicionamos la ventana
root.mainloop()

Justificar el contenido del Widget

Como en todos los controles (widgets), el primer argumento se indica el control padre, en este caso la ventana root. Para especificar la justificación del texto, esto si debe alinearse a la izquierda, derecha o al centro, lo podemos indicar usando el parámetro justify, cuyos valores pueden ser respectivamente, tk.LEFT (default), tk.RIGHT, tk.CENTER.

Ejemplo:

1
entry = ttk.Entry(root, justify=tk.RIGHT)

A través del parámetro width indicamos el ancho del control, pero no en pixeles, sino en caracteres. Por ejemplo, el siguiente código establece un ancho suficiente para visualizar una línea de 10 caracteres:

1
entry = ttk.Entry(root, width=10)

Deshabilitar el widget

La caja de texto puede iniciarse como deshabilitada (el usuario no podrá escribir en ella y aparecerá sombreada) usando el parámetro state:

1
entry = ttk.Entry(root, state=tk.DISABLED)

Luego podemos habilitarlo nuevamente, restableciendo este parámetro vía método config:

1
entry.config(state=tk.NORMAL)

Un estado intermedio es readonly (solo lectura), en el que el usuario visualiza el control normalmente pero no puede escribir en él:

1
entry = ttk.Entry(root, state="readonly")

Ocultar el contenido en el Widget

Podemos hacer que la caja de texto muestre un glifo en particular cuando queremos ocultar texto a simple vista. Por ejemplo, si el control es empleado para escribir una contraseña:

1
entry = ttk.Entry(root, show="*")

Insertar contenido en el Widget

Para añadir un texto empleamos insert() que toma como primer argumento la posición y como segundo la cadena de texto:

1
entry.insert(0, "Hola mundo!")

Este código es similar a si hicieramos lo siguiente:

1
2
entry.insert(0, "¡Hola,")
entry.insert(6, " mundo!")

Todas las operaciones en Tk que requieren una posición aceptan la constante tk.END, que representa el final del texto. En nuestro caso, tk.END es equivalente a len(entry.get()). Por esto, el siguiente código también consigue el mismo resultado que el ejemplo anterior:

1
2
entry.insert(0, "¡Hola,")
entry.insert(tk.END, " mundo!")

Eliminar contenido en el Widget

La eliminación de un texto o una parte de él se consigue a través del método delete(), pasándole como argumentos los índices de inicio y fin.

1
2
# Elimina el texto completo.
entry.delete(0, tk.END)

Seleccionar contenido en el Widget

De forma análoga opera el método select_range(), que selecciona el texto desde una posición hasta otra. Por ejemplo, el siguiente código selecciona la palabra “mundo”.

1
2
3
4
5
6
entry.insert(0, "¡Hola, mundo!")
# Seleccionar desde el carácter 7 hasta el 12.
entry.select_range(7, 12)
# Enviar el foco a la caja de texto para hacer efectiva
# la selección.
entry.focus()

Para obtener la posición del cursor en la caja de texto, llamamos al método index() con la constante tk.INSERT.

1
print(entry.index(tk.INSERT))

Y para establecer la posición:

1
2
3
4
5
entry.insert(0, "¡Hola, mundo!")
# Ubica el cursor antes de la "m".
entry.icursor(7)
# Envía el foco.
entry.focus()

Tk no provee una función específica para retornar el texto seleccionado, pero haciendo uso del método index() junto con las constantes tk.SEL_FIRST y tk.SEL_LAST que retornan los índices de inicio y fin de la selección, podemos construirla manualmente:

1
2
3
4
5
6
7
8
9
10
11
entry.insert(0, "¡Hola, mundo!")
def get_selection():
    # Comprobar primero que haya una selección.
    if entry.select_present():
        # Obtener los índices del inicio y fin de la selección
        first = entry.index(tk.SEL_FIRST)
        last = entry.index(tk.SEL_LAST)
        print(entry.get()[first:last])
    else:
        print("No hay selección.")
button = ttk.Button(text="Obtener selección", command=get_selection)

Obtener el contenido del widget

Para obtener lo que un usuario ha escrito en la caja de texto, llamamos al método get():

1
print(entry.get())

Por ejemplo, el siguinte código imprime en la consola el texto ingresado al presionar un botón

1
2
3
4
entry.insert(0, "Hola mundo!")
entry.place(x=50, y=50)
button = ttk.Button(text="Obtener texto", command=lambda: print(entry.get()))
button.place(x=50, y=100)

Ejercicio Práctico - Login

Este ejercicio, tendrá dos soluciones una será con orientación a objetos y la otra no, lo que significa que la solución usando orientación a objetos se definirá dentro de una clase con un método __init__, el cual dará el estado inicial de la ventana gráfica.

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    import tkinter as tk
    
    root = tk.Tk()
    root.title("Login")
    root.geometry("400x120")
    
    def login():
        print("Haciendo login")
        print("Usuario:", e_usuario.get())
        print("Passwor:", e_password.get())
    
    # Campo de texto: Usuario
    tk.Label(root, text="Usuario").pack()
    e_usuario = tk.Entry(root)
    e_usuario.insert(0, "Ej: Marco@user")
    e_usuario.bind('<Button-1>', lambda e: e.widget.delete(0, tk.END))
    
    e_usuario.pack()
    
    # Campo de texto: Password
    tk.Label(root, text="Contraseña").pack()
    e_password = tk.Entry(root, show="*")
    e_password.insert(0, '******')
    e_password.bind('<Button-1>', lambda e: e.widget.delete(0, tk.END))
    e_password.pack()
    
    # Botón para hacer login
    tk.Button(root, text="Login", command=login).pack(pady="5")
    
    # Mostrar la ventana
    root.mainloop()
    
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    import tkinter
    
    class Login:
    
      def __init__(self, tk):
        # Creación de la ventana principal
        self.root = tk.Tk()
        self.root.title("Login")
        self.root.geometry("400x120")
        # self.root.iconbitmap("logo.ico")
    
        # Campo de texto: Usuario
        tk.Label(self.root, text="Usuario").pack()
        self.e_usuario = tk.Entry(self.root)
        self.e_usuario.insert(0, "Ej: Marco@user")
        self.e_usuario.bind('<Button-1>', lambda e: e.widget.delete(0, tk.END))
    
        self.e_usuario.pack()
    
        # Campo de texto: Password
        tk.Label(self.root, text="Contraseña").pack()
        self.e_password = tk.Entry(self.root, show="*")
        self.e_password.insert(0, '******')
        self.e_password.bind('<Button-1>', lambda e: e.widget.delete(0, tk.END))
        self.e_password.pack()
    
        # Botón para hacer login
        tk.Button(self.root, text="Login", command=self.login).pack(pady="5")
    
        # Mostrar la ventana
        self.root.mainloop()
    
      def login(self):
        print("Haciendo login")
        print("Usuario:", self.e_usuario.get())
        print("Password:", self.e_password.get())
    
    if __name__ == '__main__':
        Login(tkinter)
    

Mi lema es

Esta entrada está licenciada bajo CC BY 4.0 por el autor.