Table of Contents
首先,我们将学习如何使用 Python Tkinter 创建多个窗口。
我们正在了解多个窗口的工作原理。通过多个窗口,我们的意思是将一个页面与其他页面连接起来,这些页面相互链接并在新选项卡中打开,甚至将我们重定向到新页面。
代码:
- 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()
以下是给定代码的一些主要亮点。
输出:
在上面的代码中,我们在屏幕底部制作了一个简单的按钮。通过单击该按钮,将打开一个新窗口。

输出:
正如我们在上面的输出中看到的,单击“单击我”按钮将打开一个新窗口。结果如下所示。

最终输出
在下一节中,我们将了解使用多个窗口注册的Python Tkinter用户。
我们必须制作一个注册表,在其中我们制作了包含与姓名、电子邮件、密码相关的信息的块列。它还使用 OTP 验证电子邮件,以检查真实用户是否有健康的数据库。
代码:
我们在此代码中使用的一些库是smtplib,sqlite3和messagebox,random,EmailMessage,Tkinter和email.message库。这里还使用了一些标签、字段、条目和按钮。
- from tkinter import *
- import re
- from tkinter import messagebox
- import sqlite3
- import random
- from email.message import EmailMessage
- import smtplib
-
-
- # Database
- 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)
-
- # functions
-
- 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 = "codetestingemail6@gmail.com"
- 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)
-
- # frames
- frame = Frame(ws, padx=20, pady=20)
- frame.pack(expand=True)
-
- # labels
- 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)
-
-
- # Entry
- 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)
-
- # button
- 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()
输出:
在上面的代码中,我们制作了一个注册表单,其中包含标签、按钮和条目等详细信息,该代码与数据库连接连接,该数据库连接添加真正的用户在此处注册。

新帐户输出
在下面的输出中,我们填写所有详细信息并验证电子邮件以进一步操作。

使用多个窗口的 Python Tkinter 用户注册
当我们检查并随机输入OTP时,我们可以看到显示一个错误,并显示消息“不正确的OTP”。这意味着在我们提供注册时使用的正确 OTP 和电子邮件地址之前,我们无法进一步行动。

Python tkinter 中的多个窗口
在下一节中,我们将了解多页访问验证。
通过访问验证,我们的意思是验证用户的密码和在注册期间注册的电子邮件。我们还可以使用此代码中的创建帐户按钮注册用户。
代码:
登录 Page.py
现在,让我们看一下我们在此代码中使用的一些库是 sqlite3 和 Tkinter 库下的 messagebox。在这里,还使用了标签、字段、条目和按钮。
- 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)
-
- # frame
- frame = Frame(ws, padx=20, pady=20)
- frame.pack_propagate(False)
- frame.pack(expand=True)
-
-
- # labels
- 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)
-
- # Entry
- 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)
-
- # button
- 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()
Output:
After running the above code, we got this output in which we can see labels of “enter username”, “enter password” and two-button working on different functionality.

登录输出
在下面的输出中,我们在密码部分下的用户名和密码中输入电子邮件,然后单击“登录”按钮。

登录窗口
正如我们所看到的,用户名和密码被用户输入错误,这表明它不会将我们重定向到另一个窗口或页面。

登录2.输出
App.py
下面是一些代码,这些代码可以在验证过程完成后运行另一个页面。
法典:
- 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)
-
- # image
- img = PhotoImage(file='img.png')
-
- # labelslo
- 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)
-
- # button
- 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()
运行以下代码并单击“登录”按钮后,我们必须输入有效的用户名和密码。它会将我们重定向到另一个窗口并向我们显示以下消息。
此外,我们可以看到一个注销按钮,它将帮助我们退出页面。

输出
您可能还想阅读以下 Tkinter 教程。