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