En Python tenemos dos instrucciones que son básicas:
- print( ). Para mostrar información o resultados en la consola.
- input( ). Para que el usuario pueda introducir datos.
Si utilizamos Tkinter los widgets básicos van a ser Label y Entry que
se corresponden con print // input de la consola de Python.
Asociados a ambos, puede ir un widget tipo Button que será el que
desencadene el evento que dé lugar a que el programa realice su trabajo.
Debemos de tener en cuenta que cualquier widget debe de situarse
en la ventana utilizando alguno de los tres sistemas de posicionamiento.
Cada uno de ellos tiene unas ventajas y unos inconvenientes, por lo que
tendremos que valorar cuál de ellos será el que mejor se adapte a nuestro
programa y a sus ventanas.
Siempre debemos de importar con “from Tkinter import” cualquier nombre de widget que vayamos a utilizar.
Label
nombre_etiqueta=Label(ventana,text=”texto”)
Para definir una etiqueta (Label), le debemos dar un nombre.
También debemos de indicar el nombre de la ventana, aunque generalmente esto solo será necesario si la ventana donde va situada no es la principal.
Necesitamos indicar el texto que va a contener la etiqueta. Esto se
puede hacer de tres formas:
- Dándole un valor en el momento de declarar la etiqueta. Esto lo haremos con el parámetro text=”texto”.
- Utilizando el método .configure Con este método es posible configurar muchos de los atributos de los widgets.
- También podemos determinar que su contenido dependa de una variable de control. Primero tendremos que definir esta variable de control y luego en lugar del parámetro text, deberemos asociarla a la etiqueta: textvariable=nombre_variable_control.
Entry
Nombre_Entry=Entry( )
Es uno de los elementos que vamos a utilizar para la entrada de datos por parte del usuario. En principio el widget Entry equivale a Input. El valor que es introducido será tomado como una cadena, al igual que ocurre con Input. Si necesitamos que dicho valor sea numérico o que tenga un determinado formato o característica, necesitamos verificar que lo que el usuario introduce se ajusta a lo requerido.
Para recuperar el valor que tiene un campo Entry, lo más habitual es utilizar el método .get( ) Si necesitamos limpiar la entrada de un campo Entry para que quede vacía, utilizaremos el método .delete, con los argumentos 0 y “end”.
Nombre_Entry.delete (0,”end”)
Nombre_Entry=Entry(textvariable=nombre_variable)
En ocasiones Entry va asociado a una variable de control, en cuyo caso la variable de control se actualizará automáticamente cada vez que el campo Entry tenga un nuevo valor.
Validación de datos.
Es muy habitual que el contenido que introduce el usuario en un campo Entry deba ser validado por el programa como paso previo a la utilización del dato.
Existen dos formas de validar dicha información. Puede hacerse directamente en el mismo momento en que el usuario está introduciendo el dato. En este caso será el propio programa (sin más intervención del usuario) quien determine si acepta el dato introducido o no. Veamos cómo funciona con un sencillo código:
from tkinter import Tk,Entry
def validacion(texto):
return texto.isdecimal() ##solo acepta dígitos 0-9
root = Tk()
root.config(width=250, height=150)
root.configure(background="#F99C45")
id=root.register(validacion) ##Solo comprobamos último caracter
entry = Entry(validate="key",validatecommand=(id,"%S"))
entry.place(x=20, y=60)
root.mainloop()

Lo primero es registrar la función que nos va a validar la entrada. Para ello utilizamos el comando:
id=root.register(validacion)
(los nombres “id” y “validación” son optativos, pueden ser cualquier
otros).
La segunda parte importante es la llamada a la función que va a
validar la entrada:
entry = Entry(validate=»key»,validatecommand=(id,»%S»))
Al definir el widget “entry”, hemos utilizado los siguientes parámetros:
“validate” Este parámetro tiene los siguientes valores optativos:
- «focus» Se valida el valor del campo cada vez que el widget obtenga o pierda el foco.
- “focusin” Se valida al ganar el foco.
- “focusout” Se valida al perder el foco.
- “key” Se valida al pulsar una tecla (en el campo entry).
- “all” Se valida en todos los casos anteriores.
“validatecommand”: Este parámetro debe de llevar incluido
obligatoriamente el registro de la función, que en este caso queda
registrado en la variable “id”. Además, añadimos el código %S, o %P.
El primero solo comprueba el carácter que se desea incluir, el segundo comprueba si la cadena que quedaría con el carácter que se desea incluir es válida o no. Si es válida, se incluye el nuevo carácter, si no lo es, no se incluye. También puede ser un texto que se pega o se corta.
En el ejemplo anterior hemos decidido validar al entrar (o eliminar
texto) y hemos pasado el carácter que se añade (o elimina). La tecla pulsada solo podrá ser un dígito (del 0 al 9). Cualquier otro carácter será rechazado.
Si es un número la función de validación devuelve “True” y el texto se incorpora al campo. Si no lo es, se devuelve “False”.
Vamos a ver ahora otro ejemplo donde pasamos a la función el texto del campo completo. La idea es comparar si el texto contiene un número decimal (positivo o negativo), por lo que ahora podremos introducir el signo “-“ al principio y también el punto que separa los decimales. Otro carácter permitido sería el signo “+” al principio. Permitimos que la cadena pueda quedar vacía si borramos el primer dígito. También hemos limitado el número máximo de caracteres a 8.
from tkinter import Tk,Entry
def validacion(texto_nuevo):
try:
if texto_nuevo=="-":
return True
if not texto_nuevo:
return True
if len(texto_nuevo)>8:
return False
if float(texto_nuevo):
return True
except ValueError:
return False
root = Tk()
root.config(width=250, height=150)
root.configure(background="#F99C45")
id=root.register(validacion)
entry = Entry(validate="key",validatecommand=(id,"%P"))
entry.place(x=20, y=60) #Se comprueba cadena completa
root.mainloop()
Vemos que el parámetro incluido en la función es “%P” que equivale
al texto completo incluido el nuevo carácter (o secuencia de caracteres, si hemos hecho un copia y pega). Si dicho texto es un número real, se valida, en caso contrario no se permite su entrada.
La otra forma de validar un texto de un widget “entry”, es dejando el
trabajo a la función que se llamaría al pulsar un botón de comando
producirse algún otro evento. Primero indicaremos en qué consiste este widget.
Button
Nombre_button=Button(text=”texto”,command=función)
Con el widget button podemos situar un botón en una ventana, que, al ser pulsado, desencadene la ejecución de una determinada acción. Suele provocar que se ejecute una función.
Los parámetros principales serán el texto que contendrá el botón (también podrá llevar asociada una imagen), y la función que se ejecutará si pulsamos dicho botón.
A continuación, vemos cómo podría ser el código para obtener el cuadrado de un número facilitado por el usuario:
from tkinter import Tk,Entry,Label,Button
def validacion():
texto_nuevo=entry.get()
try:
if len(texto_nuevo)>8:
resultado.config(text="Máximo 8 caracteres.")
return False
su_cuadrado=round(float(texto_nuevo)**2,2)
resultado.config(text=f"El cuadrado de {texto_nuevo} es {su_cuadrado}")
entry.delete(0, 'end')
except ValueError:
resultado.config(text=f"Compruebe datos. Separe decimales con \".\"")
return False
def salir():
root.destroy()
root = Tk()
root.config(width=550, height=250)
root.configure(background="#F99C45")
etiqueta_entry=Label(text="Introduzca su número:")
entry = Entry(width=10)
bot_aceptar=Button(text="ACEPTAR",command=validacion,\
background="#45F6F9")
bot_salir=Button(text="SALIR",command=salir,
background="#45F6F9")
resultado=Label(width=40, background="#F9A0A9")
etiqueta_entry.place(x=20,y=30)
entry.place(x=240, y=30)
bot_aceptar.place(x=40,y=100)
bot_salir.place(x=160,y=100)
resultado.place(x=40,y=190)
root.mainloop()
En esta ventana hemos colocado dos botones. Uno de ellos lleva
asociada la función que permite salir del programa. El otro ejecuta una función llamada “validación”. Esta función en primer lugar comprueba que hemos introducido un máximo de 8 caracteres.
A continuación, trata de convertir el dato introducido a un número
decimal. Si lo consigue nos indica su valor al cuadrado y borra todo el contenido del campo Entry para que se pueda introducir otro dato. En caso contrario nos muestra un mensaje de error.
Observamos que le hemos dado un color de fondo a Button y Label configurando su parámetro color de fondo background=»#XXXXXX»
En este primer ejemplo, hemos introducido como número el 332.34
Se muestra su cuadrado y se limpia la casilla de Entry utilizando el método nombre_Entry.delete(0, ‘end’)
En este otro ejemplo, hemos provocado un error. Hemos introducido
una coma en lugar del punto como separador de decimales, lo cual ha provocado un error de tipo de dato.

En el siguiente se han introducido más de 8 caracteres como dato de entrada y hemos establecido en la función de validación que no se deben introducir más de 8 caracteres.

Si la función llamada por Button necesita de algún parámetro,
utilizaremos la siguiente construcción:
command=lambda:funcion(valor_parámetro)
Veamos cómo quedaría el código anterior si pasamos directamente a la función de validación el contenido del campo Entry como parámetro:
from tkinter import Tk,Entry,Label,Button
def validacion(texto_nuevo):
try:
if len(texto_nuevo)>8:
resultado.config(text="Máximo 8 caracteres.")
return False
su_cuadrado=round(float(texto_nuevo)**2,2)
resultado.config(text=f"El cuadrado de {texto_nuevo} es {su_cuadrado}")
entry.delete(0, 'end')
except ValueError:
resultado.config(text=f"Compruebe datos. Separe decimales con \".\"")
return False
def salir():
root.destroy()
root = Tk()
root.config(width=550, height=250)
root.configure(background="#F99C45")
etiqueta_entry=Label(text="Introduzca su número:")
entry = Entry(width=10)
bot_aceptar=Button(text="ACEPTAR",command=lambda:validacion(entry.get()),background="#45F6F9")
bot_salir=Button(text="SALIR",command=salir,
background="#45F6F9")
resultado=Label(width=40, background="#F9A0A9")
etiqueta_entry.place(x=20,y=30)
entry.place(x=240, y=30)
bot_aceptar.place(x=40,y=100)
bot_salir.place(x=160,y=100)
resultado.place(x=40,y=190)
root.mainloop()Como vemos, ahora la función de validación recibe un parámetro que sustituye a la anterior instrucción que tenía: texto_nuevo=entry.get()
ASPECTO DE LOS WIDGETS
Los widgets tienen unos parámetros por defecto. Estos parámetros pueden ser modificados asignándoles nuevos valores.
Dimensiones:
heigth=”altura en líneas o píxeles” . Podemos especificar el alto de un widget con el parámetro “height”.
width=”anchura en caracteres o píxeles”. También se puede especificar la anchura a través del parámetro “width”.
Por ejemplo, vamos a modificar la altura del button “ACEPTAR” y la anchura “SALIR” del ejemplo anterior:
bot_aceptar=Button(text="ACEPTAR",command=validacion,height=2, background="#45F6F9")
bot_salir=Button(text="SALIR",command=salir,width=12, background="#45F6F9")
Vemos que después de modificar las dimensiones, el texto que contienen los widgets se ha adaptado a las nuevas medidas, para quedar centrado.
relief=”flat-raised-sunken-groove-ridge” /// borderwidth=x Se utiliza para darle relieve al borde. Su valor será uno de los indicados. Debe de ir acompañado del parámetro borderwidth, que indica el grosor del borde en píxeles.
anchor=”n-s-e-w-ne-nw-se-sw-center” Con el parámetro “anchor” indicamos la posición del texto en el widget. Las posiciones se corresponden con los puntos cardinales geográficos, además de “center” que indica que el texto se colocará en el centro del widget (es la posición por defecto).
bot_aceptar=Button(text="ACEPTAR",command=validacion,height=2, background="#45F6F9",anchor="s",relief="groove", borderwidth=8)
bot_salir=Button(text="SALIR",command=salir,width=12,anchor="e", relief="ridge",borderwidth=8,background="#45F6F9")
Nota: Si especificamos el parámetro “anchor” para un widget y no lo especificamos para el siguiente, puede ocurrir que el segundo herede el anchor del primero.
Color de los widgets El color lo podemos definir de dos formas:
Con su nombre directamente: “white”, ”red”, “black”, “green”, “blue”, “cyan”, “yellow”, “orange”, “magenta”…
Con su código RGB. Escribiríamos entre comillas los 6 dígitos que
identifican su RGB, precedidos de almohadilla. El código RGB lo podemos
obtener mediante la paleta de colores de cualquier aplicación ofimática
que pueda dar color a un texto o fondo. Por supuesto también lo podemos
consultar por internet.

En la imagen vemos seleccionado un color verde fuerte. Lo
importante es su código RGB: “#1A7C62”
background=”nombre_color // o RGB” Con este parámetro podemos establecer el color de fondo de un widget. En los ejemplos anteriores hemos visto casos de su aplicación.
foreground=”nombre_color // o RGB” Nos permite darle color al contenido del widget. Generalmente al texto que contiene.
Veamos como quedan los widgets, después de darles un poco de
color a todos ellos, incluida la ventana principal. Utilizaremos para ello un nuevo código que nos va a indicar si un número introducido es primo o no.
from tkinter import Tk,Entry,Label,Button
def numero_primo(numero):
for k in range(2,numero//2):
if numero % k ==0:
return k
return 0
def validacion():
try:
entero=int(entry.get())
if entero<1: error=int("mal")
respuesta=numero_primo(entero)
if respuesta==0:
mi_texto=(f"El número {entero} es un número primo.\n")
else:
mi_texto=(f"El número {entero} no es primo, ya que es divisible por {respuesta}.")
resultado.config(text=mi_texto)
entry.delete(0, 'end')
except ValueError:
resultado.config(text="Compruebedatos. Introduzca un número entero mayor que 0.")
return False
def salir():
root.destroy()
root = Tk()
root.config(width=700, height=250,background="#FFBD5D")
etiqueta_entry=Label(text="Introduzca un número entero:", background="#BDF7FB",foreground="red",anchor="e")
entry=Entry(width=10,background="yellow",foreground="#08767E")
bot_aceptar=Button(text="ACEPTAR", height=2,anchor="s", relief="groove", borderwidth=6,command=validacion, background="red",foreground="yellow")
bot_salir=Button(text="SALIR",width=12, relief="ridge",borderwidth=6,command=salir, background="#8AF945",foreground="#FC3904")
resultado=Label(width=60,background="#BDF7FB", foreground="red")
etiqueta_entry.place(x=20,y=30)
entry.place(x=320, y=30)
bot_aceptar.place(x=40,y=100)
bot_salir.place(x=180,y=100)
resultado.place(x=20,y=190)
root.mainloop()

