1. Descripción
- Python Tkinter múltiples ventanas
- Registro de usuario de Python Tkinter con múltiples ventanas
- Verificación de acceso a varias páginas de Python Tkinter
Tabla de contenido
2. Problema de ventanas múltiples
Primero, aprenderemos cómo crear múltiples ventanas usando Python Tkinter .
Estamos aprendiendo cómo funcionan las ventanas múltiples. Por ventanas múltiples nos referimos a conectar una página con otras páginas que están vinculadas entre sí y se abren en nuevas pestañas o incluso nos redirigen a nuevas páginas.
código :
import tkinter as tk
def New_Window():
Window = tk.Toplevel()
canvas = tk.Canvas(Window, height=HEIGHT, width=WIDTH)
canvas.pack()
HEIGHT = 300
WIDTH = 500
ws = tk.Tk()
ws.title("Python Guides")
canvas = tk.Canvas(ws, height=HEIGHT, width=WIDTH)
canvas.pack()
button = tk.Button(ws, text="Click ME", bg='White', fg='Black',
command=lambda: New_Window())
button.pack()
ws.mainloop()
A continuación se muestran algunos aspectos destacados clave del código proporcionado.
- WS para la ventana raíz
- altura = la altura del widget de lienzo.
- ancho = Ancho del widget de lienzo.
- BG se utiliza para el color de fondo.
- FG se utiliza para el color de primer plano.
- Tut tut . Button() se utiliza para agregar un botón.
producción:
En el código anterior, creamos un botón simple en la parte inferior de la pantalla. Al hacer clic en el botón, se abrirá una nueva ventana.
producción:
Como podemos ver en el resultado anterior, al hacer clic en el botón " Hacer clic en mí " se abrirá una nueva ventana. El resultado se muestra a continuación.
salida final
3. Registro de usuario de Python Tkinter usando múltiples ventanas
En la siguiente sección, veremos un usuario de Python Tkinter registrado con múltiples ventanas.
Tenemos que hacer un registro donde hemos hecho columnas de bloque que contienen información relacionada con nombre, correo electrónico, contraseña. También utiliza correos electrónicos de verificación OTP para verificar si los usuarios reales tienen una base de datos saludable.
código:
Algunas de las bibliotecas que utilizamos en este código son smtplib , sqlite3 y messagebox , random , EmailMessage , Tkinter y la biblioteca email.message. También se utilizan aquí algunas etiquetas, campos, entradas y botones.
- sqllite3.connect() para conexión a base de datos
- Label() se utiliza para mostrar texto en esta vista de usuario, no interactiva.
- Entry() es un cuadro de texto de una sola línea que acepta un valor del usuario.
from tkinter import *
import re
from tkinter import messagebox
import sqlite3
import random
from email.message import EmailMessage
import smtplib
<strong># Database</strong>
try:
con = sqlite3.connect('website.db')
con.execute('''create table if not exists users(
fname text not null,
lname text not null,
email text not null,
password text not null);
''')
con.close()
except Exception as ep:
messagebox.showerror('', ep)
ws = Tk()
ws.title('Python Guides')
ws.geometry('500x400')
ws.config(bg="#447c84")
ws.attributes('-fullscreen',True)
<strong># functions</strong>
def otp_gen():
pass
cpy = ''
def sendOtp():
otp_no = ''
for _ in range(4):
r = random.randint(0, 9)
otp_no += str(r)
global cpy
cpy += otp_no
sender = "[email protected]"
reciever = em.get()
password = "Cute...pie@0823"
msg_body = f'otp is {cpy}'
msg = EmailMessage()
msg['subject'] = 'OTP'
msg['from'] = sender
msg['to'] = reciever
msg.set_content(msg_body)
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(sender,password)
smtp.send_message(msg)
print(cpy)
return cpy
def clr():
fname.delete(0, END)
lname.delete(0, END)
em.delete(0, END)
pwd.delete(0, END)
def submit():
enteredOtp = otp.get()
expectedOtp = cpy
print(expectedOtp)
fname_check = fname.get()
lname_check = lname.get()
em_check = em.get()
pwd_check = pwd.get()
otp_check = otp.get()
check_count = 0
if fname_check == "":
warn = "First name can't be empty!"
else:
check_count += 1
if lname_check == "":
warn = "Last name can't be empty!"
else:
check_count += 1
if em_check == "":
warn = "Email can't be empty!"
else:
check_count += 1
if pwd_check == "":
warn = "Password can't be empty!"
else:
check_count += 1
if otp_check == "":
warn = "Otp can't be empty!"
else:
check_count += 1
# if fname_check, lname_check, pwd_check, otp_check:
if check_count == 5:
if (expectedOtp == enteredOtp):
con = sqlite3.connect('website.db')
c = con.cursor()
c.execute("insert into users VALUES (:fname, :lname, :em, :pwd)",{
'fname': fname.get(),
'lname': lname.get(),
'em': em.get(),
'pwd': pwd.get()
})
con.commit()
ws.destroy()
import app
else:
messagebox.showerror('','Incorrect Otp')
else:
messagebox.showerror('', warn)
<strong># frames</strong>
frame = Frame(ws, padx=20, pady=20)
frame.pack(expand=True)
<strong># labels</strong>
Label(
frame,
text="Create New Account",
font=("Times", "24", "bold")
).grid(row=0, columnspan=3, pady=10)
Label(
frame,
text='First Name',
font=("Times", "14")
).grid(row=1, column=0, pady=5)
Label(
frame,
text='Last Name',
font=("Times", "14")
).grid(row=2, column=0, pady=5)
Label(
frame,
text='Email Address',
font=("Times", "14")
).grid(row=3, column=0, pady=5)
Label(
frame,
text='Password',
font=("Times", "14")
).grid(row=4, column=0, pady=5)
Label(
frame,
text='Enter OTP',
font=("Times", "14")
).grid(row=5, column=0, pady=5)
<strong># Entry</strong>
fname = Entry(frame, width=30)
lname = Entry(frame, width=30)
em = Entry(frame, width=30)
pwd = Entry(frame, width=30)
otp = Entry(frame, width=30)
fname.grid(row=1, column=1)
lname.grid(row=2, column=1)
em.grid(row=3, column=1)
pwd.grid(row=4, column=1)
otp.grid(row=5, column=1)
<strong># button </strong>
clr = Button(frame, text="Clear", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=clr)
reg = Button(frame, text="Register", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=submit)
ext = Button(frame, text="Exit", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=lambda:ws.destroy())
otpp = Button(frame, text="verify email", padx=10, relief=RAISED, font=("Times", "10", "bold"), command=sendOtp)
clr.grid(row=6, column=0, pady=20)
reg.grid(row=6, column=1, pady=20)
ext.grid(row=6, column=2, pady=20)
otpp.grid(row=5, column=2)
ws.mainloop()
producción:
En el código anterior hemos creado un formulario de registro con detalles como etiquetas, botones y entradas , este código está conectado con una conexión de base de datos que agrega usuarios reales para registrarse aquí.
salida de cuenta nueva
En el resultado a continuación, completamos todos los detalles y verificamos el correo electrónico para tomar medidas adicionales.
Registro de usuario de Python Tkinter con múltiples ventanas
Cuando verificamos e ingresamos aleatoriamente la OTP, podemos ver que se muestra un error con el mensaje " OTP incorrecta ". Esto significa que no podemos continuar hasta que proporcionemos la OTP y la dirección de correo electrónico correctas utilizadas para el registro.
Múltiples ventanas en Python tkinter
4. Verificación de acceso a varias páginas de Python Tkinter
En la siguiente sección, veremos la validación del acceso a varias páginas.
Por verificación de acceso nos referimos a verificar la contraseña y el correo electrónico del usuario registrado durante el registro. También podemos registrar un usuario usando el botón crear cuenta en este código.
código:
Iniciar sesión en la página.py
Ahora, veamos que algunas de las bibliotecas que estamos usando en este código son sqlite3 y messagebox en la biblioteca Tkinter . Aquí también se utilizan etiquetas, campos, entradas y botones.
- ONU para nombre de usuario
- PD para contraseña
- messagebox.showerror() se usa cuando se ingresa algún nombre de usuario y contraseña incorrectos, automáticamente mostrará el error.
from tkinter import *
from tkinter import messagebox
import sqlite3
try:
con = sqlite3.connect('website.db')
c = con.cursor()
c.execute("Select * from users")
for i in c.fetchall():
un = i[2]
pd = i[3]
except Exception as ep:
messagebox.showerror('', ep)
ws = Tk()
ws.title('Python Guides')
ws.geometry('500x400')
ws.config(bg="#447c84")
ws.attributes('-fullscreen',True)
def createAccount():
ws.destroy()
import register
def submit():
u = uname.get()
p = pwd.get()
check_counter=0
if u == "":
warn = "Username can't be empty"
else:
check_counter += 1
if p == "":
warn = "Password can't be empty"
else:
check_counter += 1
if check_counter == 2:
if (u == un and p == pd):
ws.destroy()
import app
else:
messagebox.showerror('', 'invalid username or password')
else:
messagebox.showerror('', warn)
<strong># frame</strong>
frame = Frame(ws, padx=20, pady=20)
frame.pack_propagate(False)
frame.pack(expand=True)
<strong># labels</strong>
Label(
frame,
text="Admin Login",
font=("Times", "24", "bold")
).grid(row=0, columnspan=3, pady=10) #..place(x=170, y=10)
Label(
frame,
text='Enter Username',
font=("Times", "14")
).grid(row=1, column=1, pady=5) #.place(x=50, y=70)
Label(
frame,
text='Enter Password',
font=("Times", "14")
).grid(row=2, column=1, pady=5) #.place(x=50, y=110)
<strong># Entry</strong>
uname = Entry(frame, width=20)
pwd = Entry(frame, width=20, show="*")
# uname.place(x=220, y=70)
# pwd.place(x=220, y=110)
uname.grid(row=1, column=2)
pwd.grid(row=2, column=2)
<strong># button</strong>
reg = Button(
frame,
text="Create Account",
padx=20, pady=10,
relief=RAISED,
font=("Times", "14", "bold"),
command=createAccount
)
sub = Button(
frame,
text="Login",
padx=20,
pady=10,
relief=RAISED,
font=("Times", "14", "bold"),
command=submit
)
reg.grid(row=3, column=1, pady=10)
sub.grid(row=3, column=2, pady=10)
ws.mainloop()
Producción:
Después de ejecutar el código anterior, obtuvimos este resultado en el que podemos ver etiquetas de "ingresar nombre de usuario" , "ingresar contraseña" y dos botones trabajando en diferentes funciones.
salida de registro
En el resultado a continuación, ingresamos el correo electrónico en el nombre de usuario y la contraseña en la sección de contraseña y hicimos clic en el botón Iniciar sesión.
ventana de inicio de sesión
Como podemos ver el usuario y contraseña son ingresados incorrectamente por parte del usuario, lo que demuestra que no nos redirige a otra ventana o página.
iniciar sesión 2. salida
aplicación.py
A continuación se muestra un código que ejecuta otra página una vez que se completa el proceso de verificación.
código:
from tkinter import *
from tkinter import messagebox
ws = Tk()
ws.title('Python Guides')
ws.geometry('500x300')
ws.config(bg="#447c84")
ws.attributes('-fullscreen',True)
# functions
def msg():
return messagebox.showinfo('', 'Life is short, \n do what you love')
def logOut():
resp = messagebox.askquestion('', 'Are you sure?')
if resp == 'yes':
ws.destroy()
else:
pass
# frames
frame = Frame(
ws,
padx=20,
pady=20
)
frame.pack(expand=True)
<strong># image </strong>
img = PhotoImage(file='img.png')
<strong># labelslo</strong>
Label(
frame,
text="Congratulations!",
font=("Times", "24", "bold")
).grid(row=0, columnspan=3)
Label(
frame,
text='Your Account is Active',
fg='green',
font=("Times", "14")
).grid(row=1, columnspan=3)
imglbl = Label(frame, image=img)
imglbl.grid(row=2, column=1)
<strong># button</strong>
exp = Button(frame, text="open>>", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=msg)
logout = Button(frame, text="Logout", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=logOut)
exp.grid(row=2 , column=1)
logout.grid(row=3, column=1)
ws.mainloop()
Luego de ejecutar el siguiente código y hacer clic en el botón "Iniciar sesión ", debemos ingresar un nombre de usuario y contraseña válidos. Nos redireccionará a otra ventana y nos mostrará el siguiente mensaje.
Además, podemos ver un botón de cierre de sesión que nos ayudará a salir de la página.
producción
Quizás también quieras leer los siguientes tutoriales de Tkinter.