Saltar a contenido
 No os perd谩is mi futuro contenido, seguidme en y Youtube 馃榿

Widget Entry (Texto corto)

Los campos de texto sirven generalmente para que el usuario escriba un valor. Ser铆a un puente que equivaldr铆a a la funci贸n input() pero gr谩ficamente. Lo bueno es que integra muchos m茅todos que le permiten desde borrar el texto a desactivar el campo.

Note

from tkinter import *
root = Tk()

entry = Entry(root)
entry.pack()

root.mainloop()

Podemos a帽adir una label a la izquierda para indicar informaci贸n sobre el campo:

Note

entry = Entry(root)
entry.pack(side=RIGHT)

label = Label(root, text="Nombre")
label .pack(side=LEFT)

Lo malo es que si intentamos crear m谩s etiquetas y campos, esto se posicionan mal:

Note

entry2 = Entry(root)
entry2.pack(side=RIGHT)

label2 = Label(root, text="Apellidos")
label2 .pack(side=LEFT)

Como sabemos Pack() intenta posicionar autom谩ticamente los elementos y alinearlos con los par谩metros side y anchor, pero en este caso no hay una distribuci贸n m谩s all谩 de la alineaci贸n, por 茅so se ve mal.

Para solucionarlo se puede hacer de distintas formas. Por ejemplo creando dos marcos, y a帽adir una etiqueta y un campo de texto en cada una. De esta forma el marco har谩 de separador:

Note

frame1 = Frame(root)
frame1.pack()

entry = Entry(frame1)
entry.pack(side=RIGHT)

label = Label(frame1, text="Nombre")
label.pack(side=LEFT)

frame2 = Frame(root)
frame2.pack()

entry2 = Entry(frame2)
entry2.pack(side=RIGHT)

label2 = Label(frame2, text="Apellidos")
label2.pack(side=LEFT)

Sin embargo fijaros como las labels no parecen estar alineadas bien. Claro, 茅so es porque el texto de Nombre y el de Apellidos no ocupa lo mismo. Podemos hacer un truco r谩pido a帽adiendo un par de espacios en Nombre:

Note

label = Label(frame1, text="Nombre ")

Pero a煤n no acaba de salir bien. 驴Entonces c贸mo podemos posicionar bien estos widgets? La respuesta es utilizando una disposici贸n cuadr铆cula, otra de las formas de tkinter para distribuir autom谩ticamente los widgets.

Para hacerlo, en lugar del pack() utilizaremos grid() e indicaremos una fila y una columna para cada widget (borramos los frames):

Note

label = Label(root, text="Nombre")
label.grid(row=0,column=0)

entry = Entry(root)
entry.grid(row=0,column=1)

label2 = Label(root, text="Apellidos")
label2.grid(row=1,column=0)

entry2 = Entry(root)
entry2.grid(row=1,column=1)

De esta forma no importa cu谩n larga sea una label, todo se posicionar谩 siguiente la cuadr铆cula y cada widget quedar谩 perfectamente separado de los otros. Quiz谩 el problema que tenemos es que no tenemos las etiquetas justificadas al mismo lado y queda un poco raro. Aqu铆 es donde entra el par谩metro sticky (pegado) de grid():

Note

label = Label(root, text="Nombre")
label.grid(row=0,column=0, sticky=W)

entry = Entry(root)
entry.grid(row=0,column=1)

label2 = Label(root, text="Apellidos")
label2.grid(row=1,column=0, sticky=W)

entry2 = Entry(root)
entry2.grid(row=1,column=1)

Incluso podr铆amos acabar de afinar la separaci贸n indicando un padding en la grid, aunque este par谩metro est谩 en todos los widgets:

Note

label = Label(root, text="Nombre")
label.grid(row=0,column=0, sticky=W, padx=5, pady=5)

entry = Entry(root)
entry.grid(row=0,column=1, padx=5, pady=5)

label2 = Label(root, text="Apellidos")
label2.grid(row=1,column=0, sticky=W, padx=5, pady=5)

entry2 = Entry(root)
entry2.grid(row=1,column=1, padx=5, pady=5)

Como v茅is estoy introduciendo conceptos poco a poco para no saturaros demasiado. Para acabar esta lecci贸n os ense帽ar茅 algunos par谩metros m谩s de los campos de texto, a parte de los de colorear o cambiar la fuente que ya conocemos:

Note

justify=LEFT, CENTER, RIGHT   # justificar el texto
state=DISABLED, NORMAL        # desactivar el campo
show="*"                      # para contrase帽as mostrar * o lo que sea

C贸digo final:

Note

from tkinter import *

# Configuraci贸n de la ra铆z
root = Tk()

label = Label(root, text="Nombre muy largo")
label.grid(row=0, column=0, sticky="w", padx=5, pady=5)

entry = Entry(root)
entry.grid(row=0, column=1, padx=5, pady=5)
entry.config(justify="right", state="normal")

label2 = Label(root, text="Contrase帽a")
label2.grid(row=1, column=0, sticky="w", padx=5, pady=5)

entry2 = Entry(root)
entry2.grid(row=1, column=1, padx=5, pady=5)
entry2.config(justify="center", show="?")

# Finalmente bucle de la aplicaci贸n
root.mainloop()

脷ltima edici贸n: 4 de Octubre de 2018