Soluciones de ejercicios – Curso de 100 días de Python #14
Esta página contiene las soluciones para los ejercicios del día 14 del curso. Ejercicios dedicados a Tkinter de Python.
- La ruta almacenada es la misma en la cual tienes el archivo .py. Esto se obtiene de forma dinámica gracias a la variable especial __file___ de Python.
- Aquí podías poner una ruta estática en el iconbitmap o una ruta dinámica como la que tengo en este código:
#Importaciones from tkinter import * import os #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("www.programacionfacil.org") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Bucle de ejecución root.mainloop()
Te dejo aquí mi estructura de carpetas por si te es más fácil de interpretar la solución:
- La primera solución (sin utilizar lista para los nombres), es esta:
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") carpeta_motocicletas = os.path.join(carpeta_imagenes, "motocicletas") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("www.programacionfacil.org") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Carga de imágenes #Motocicleta 1 motocicleta_1 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, "moto-1.jpg")).resize((400,250))) muestra_moto_1 = Label(image=motocicleta_1) muestra_moto_1.grid(row=0, column=0) #Motocicleta 2 motocicleta_2 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, "moto-2.jpg")).resize((400,250))) muestra_moto_2 = Label(image=motocicleta_2) muestra_moto_2.grid(row=1, column=0) #Motocicleta 3 motocicleta_3 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, "moto-3.jpg")).resize((400,250))) muestra_moto_3 = Label(image=motocicleta_3) muestra_moto_3.grid(row=0, column=1) #Motocicleta 4 motocicleta_4 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, "moto-4.jpg")).resize((400,250))) muestra_moto_4 = Label(image=motocicleta_4) muestra_moto_4.grid(row=1, column=1) #Bucle de ejecución root.mainloop()
Espero que hayas ajustado los resize() para que queden en una proporción adecuada.
Finalmente, la solución opcional utilizando una lista para las rutas. Solo cambian las líneas 14 (la lista), 25, 30, 35 y 40. En lugar del nombre de las imágenes, he formateado las posiciones de la lista. De esa forma, tengo estas imágenes relacionadas, agrupadas en una lista.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") carpeta_motocicletas = os.path.join(carpeta_imagenes, "motocicletas") lista_motocicletas = ["moto-1.jpg", "moto-2.jpg","moto-3.jpg","moto-4.jpg"] #Creación de la ventana principal root = Tk() #Título de la ventana root.title("www.programacionfacil.org") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Carga de imágenes #Motocicleta 1 motocicleta_1 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, f"{lista_motocicletas[0]}")).resize((400,250))) muestra_moto_1 = Label(image=motocicleta_1) muestra_moto_1.grid(row=0, column=0) #Motocicleta 2 motocicleta_2 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, f"{lista_motocicletas[1]}")).resize((400,250))) muestra_moto_2 = Label(image=motocicleta_2) muestra_moto_2.grid(row=1, column=0) #Motocicleta 3 motocicleta_3 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, f"{lista_motocicletas[2]}")).resize((400,250))) muestra_moto_3 = Label(image=motocicleta_3) muestra_moto_3.grid(row=0, column=1) #Motocicleta 4 motocicleta_4 = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_motocicletas, f"{lista_motocicletas[3]}")).resize((400,250))) muestra_moto_4 = Label(image=motocicleta_4) muestra_moto_4.grid(row=1, column=1) #Bucle de ejecución root.mainloop()
- Llegamos al proyecto. Aquí tenías que crear un login simulado para la tienda de motocicletas.
5- Icono personalizado
#Importaciones from tkinter import * import os #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Bucle de ejecución root.mainloop()
6- Título de ventana con el nombre de la tienda.
Se añade la línea 17.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Bucle de ejecución root.mainloop()
7- Una imagen con el logo de la tienda.
Se añaden las líneas de la 21 a la 25.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Bucle de ejecución root.mainloop()
8- Dos etiquetas que pongan, «Usuario» y «Contraseña».
Se añaden las líneas de la 27 a la 32.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() #Contraseña Label(text="Contraseña").pack() #Bucle de ejecución root.mainloop()
9- Dos entradas de texto correspondientes a estas etiquetas.
Se añaden las líneas 30, 31, 35 y 36
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.pack() #Bucle de ejecución root.mainloop()
10- Las entradas de texto deben tener en su interior estos mensajes por defecto: «Ej:Laura» en el de usuario y la contraseña llevará «*******» 7 asteriscos.
Se añaden las líneas 31 y 37.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.pack() #Bucle de ejecución root.mainloop()
11- Un botón para enviar.
Se añaden las líneas 40 y 41.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.pack() #Botón de envío Button(text="Entrar").pack() #Bucle de ejecución root.mainloop()
Requisitos opcionales del proyecto
12- Pon los asteriscos de la contraseña con el método de multiplicación de strings.
Se modifica la línea 37.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*"*7) contrasena.pack() #Botón de envío Button(text="Entrar").pack() #Bucle de ejecución root.mainloop()
13- Los mensajes, por defecto de las entradas de texto, serán eliminados una vez se pulse el click izquierdo para empezar a escribir.
Se añaden las líneas 32 y 39.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.bind("<Button-1>", lambda e: usuario.delete(0, END)) usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.bind("<Button-1>", lambda e: contrasena.delete(0, END)) contrasena.pack() #Botón de envío Button(text="Entrar").pack() #Bucle de ejecución root.mainloop()
14- Crea una tupla vacía llamada «usuario_creado». Esta tupla servirá para almacenar el usuario y la contraseña.
Se añaden las líneas 14 y 15.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de usuario nuevo usuario_creado = () #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.bind("<Button-1>", lambda e: usuario.delete(0, END)) usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.bind("<Button-1>", lambda e: contrasena.delete(0, END)) contrasena.pack() #Botón de envío Button(text="Entrar").pack() #Bucle de ejecución root.mainloop()
15- Crea una entrada por la consola que pida el usuario y la contraseña. Ambas cosas se deben pedir dos veces, con el fin de comprobar que no se haya equivocado.
Se añaden las líneas de la 17 a la 22.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de usuario nuevo usuario_creado = () #Se pide usuario y contraseña en la consola nuevo_usuario = input("Introduzca un nombre para el nuevo usuario.\n") nueva_contrasena = input("Introduzca una contraseña para el nuevo usuario.\n") #Se solicta de nuevo el usuario y la contraseña repite_usuario = input("Introduzca el nombre de usuario de nuevo.\n") repite_contrasena = input("Introduzca la contraseña de nuevo.\n") #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.bind("<Button-1>", lambda e: usuario.delete(0, END)) usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.bind("<Button-1>", lambda e: contrasena.delete(0, END)) contrasena.pack() #Botón de envío Button(text="Entrar").pack() #Bucle de ejecución root.mainloop()
16 – Si los datos coinciden, se almacenarán en dos posiciones de la tupla «usuario_creado».
Se añaden las líneas de la 25 a la 30.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de usuario nuevo usuario_creado = () while True: #Se pide usuario y contraseña en la consola nuevo_usuario = input("Introduzca un nombre para el nuevo usuario.\n") nueva_contrasena = input("Introduzca una contraseña para el nuevo usuario.\n") #Se solicta de nuevo el usuario y la contraseña repite_usuario = input("Introduzca el nombre de usuario de nuevo.\n") repite_contrasena = input("Introduzca la contraseña de nuevo.\n") #Se evalúa si el usuario o contraseña coinciden if nuevo_usuario != repite_usuario or nueva_contrasena != repite_contrasena: print("Los valores no coinciden, vuelva a intentarlo.") else: usuario_creado = (nuevo_usuario,nueva_contrasena) break #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.bind("<Button-1>", lambda e: usuario.delete(0, END)) usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.bind("<Button-1>", lambda e: contrasena.delete(0, END)) contrasena.pack() #Botón de envío Button(text="Entrar").pack() #Bucle de ejecución root.mainloop()
17- Crea un sistema sencillo que sea capaz de detectar si el usuario y la contraseña coinciden. Este sistema irá con los Entry, si pone mal el usuario o la contraseña, al pulsar el botón, le deberá informar del fallo con una etiqueta y lo puede volver a intentar. En cambio, si es correcto, le avisamos de ello.
Se añaden las líneas de la 60 a la 67. Se modifica también el botón para añadirle un command (línea 70).
#Importaciones from tkinter import * import os from PIL import ImageTk, Image #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de usuario nuevo usuario_creado = () while True: #Se pide usuario y contraseña en la consola nuevo_usuario = input("Introduzca un nombre para el nuevo usuario.\n") nueva_contrasena = input("Introduzca una contraseña para el nuevo usuario.\n") #Se solicta de nuevo el usuario y la contraseña repite_usuario = input("Introduzca el nombre de usuario de nuevo.\n") repite_contrasena = input("Introduzca la contraseña de nuevo.\n") #Se evalúa si el usuario o contraseña coinciden if nuevo_usuario != repite_usuario or nueva_contrasena != repite_contrasena: print("Los valores no coinciden, vuelva a intentarlo.") else: usuario_creado = (nuevo_usuario,nueva_contrasena) break #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.bind("<Button-1>", lambda e: usuario.delete(0, END)) usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.bind("<Button-1>", lambda e: contrasena.delete(0, END)) contrasena.pack() # Función para validar el login def validar(): obtener_usuario = usuario.get() obtener_contrasena = contrasena.get() if obtener_usuario != usuario_creado[0] or obtener_contrasena != usuario_creado[1]: Label(text="Usuario o contraseña incorrectos.").pack() else: Label(text=f"Hola, {usuario_creado[0]}. Espere unos instantes...").pack() #Botón de envío Button(text="Entrar", command=validar).pack() #Bucle de ejecución root.mainloop()
18 – Parte de investigación
Para solucionar esta última parte, tenías que investigar un poco sobre el módulo getpass.
La importación está en la línea 5.
Lo único que cambia en el código, son los dos input() de la contraseña. En su lugar, utilizamos este input() especial de getpass que puedes ver en las líneas 21 y 24.
#Importaciones from tkinter import * import os from PIL import ImageTk, Image import getpass #---Carga de directorios--- #Carpeta principal carpeta_principal = os.path.dirname(__file__) #Imágenes carpeta_imagenes = os.path.join(carpeta_principal, "imagenes") carpeta_logos = os.path.join(carpeta_imagenes, "logos") #Creación de usuario nuevo usuario_creado = () while True: #Se pide usuario y contraseña en la consola nuevo_usuario = input("Introduzca un nombre para el nuevo usuario.\n") nueva_contrasena = getpass.getpass("Introduzca una contraseña para el nuevo usuario.\n") #Se solicta de nuevo el usuario y la contraseña repite_usuario = input("Introduzca el nombre de usuario de nuevo.\n") repite_contrasena = getpass.getpass("Introduzca la contraseña de nuevo.\n") #Se evalúa si el usuario o contraseña coinciden if nuevo_usuario != repite_usuario or nueva_contrasena != repite_contrasena: print("Los valores no coinciden, vuelva a intentarlo.") else: usuario_creado = (nuevo_usuario,nueva_contrasena) break #Creación de la ventana principal root = Tk() #Título de la ventana root.title("American rider") #Icono de la ventana root.iconbitmap(os.path.join(carpeta_logos, "logo.ico")) #Contenido de la ventana principal #Logo logo = ImageTk.PhotoImage(Image.open(os.path.join(carpeta_logos, "logo.png")).resize((300,225))) etiqueta = Label(image=logo) etiqueta.pack() #Campos de texto #Usuario Label(text="Usuario").pack() usuario = Entry() usuario.insert(0, "Ej:Laura") usuario.bind("<Button-1>", lambda e: usuario.delete(0, END)) usuario.pack() #Contraseña Label(text="Contraseña").pack() contrasena = Entry() contrasena.insert(0, "*******") contrasena.bind("<Button-1>", lambda e: contrasena.delete(0, END)) contrasena.pack() # Función para validar el login def validar(): obtener_usuario = usuario.get() obtener_contrasena = contrasena.get() if obtener_usuario != usuario_creado[0] or obtener_contrasena != usuario_creado[1]: Label(text="Usuario o contraseña incorrectos.").pack() else: Label(text=f"Hola, {usuario_creado[0]}. Espere unos instantes...").pack() #Botón de envío Button(text="Entrar", command=validar).pack() #Bucle de ejecución root.mainloop()
2 comentarios en «Soluciones de ejercicios de Python y Tkinter»