Python Tkinter Multiple Windows 教程
一、说明
- Python Tkinter multiple windows
- 使用多个窗口的 Python Tkinter 用户注册
- Python Tkinter 多页访问验证
Table of Contents
二、多窗口问题
首先,我们将学习如何使用 Python Tkinter 创建多个窗口。
我们正在了解多个窗口的工作原理。通过多个窗口,我们的意思是将一个页面与其他页面连接起来,这些页面相互链接并在新选项卡中打开,甚至将我们重定向到新页面。
代码:
import tkinter as tkdef New_Window():Window = tk.Toplevel()canvas = tk.Canvas(Window, height=HEIGHT, width=WIDTH)canvas.pack()HEIGHT = 300
WIDTH = 500ws = 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() 以下是给定代码的一些主要亮点。
- WS 用于根窗口
- 高度 = 画布小组件的高度。
- 宽度 = 宽度用于画布小部件。
- BG用于背景颜色。
- FG 用于前景色。
- 啧啧。Button() 用于添加按钮。
输出:
在上面的代码中,我们在屏幕底部制作了一个简单的按钮。通过单击该按钮,将打开一个新窗口。

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

最终输出
三、使用多个窗口的 Python Tkinter 用户注册
在下一节中,我们将了解使用多个窗口注册的Python Tkinter用户。
我们必须制作一个注册表,在其中我们制作了包含与姓名、电子邮件、密码相关的信息的块列。它还使用 OTP 验证电子邮件,以检查真实用户是否有健康的数据库。
代码:
我们在此代码中使用的一些库是smtplib,sqlite3和messagebox,random,EmailMessage,Tkinter和email.message库。这里还使用了一些标签、字段、条目和按钮。
- sqllite3.connect() 用于数据库连接
- Label() 用于在此用户中显示文本只是视图不交互。
- Entry() 是一个单行文本框,用于接受来自用户的值。
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():passcpy = ''def sendOtp():otp_no = ''for _ in range(4):r = random.randint(0, 9)otp_no += str(r) global cpy cpy += otp_nosender = "codetestingemail6@gmail.com"reciever = em.get()password = "Cute...pie@0823"msg_body = f'otp is {cpy}'msg = EmailMessage()msg['subject'] = 'OTP' msg['from'] = sendermsg['to'] = recievermsg.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 cpydef clr():fname.delete(0, END)lname.delete(0, END)em.delete(0, END)pwd.delete(0, END)def submit():enteredOtp = otp.get()expectedOtp = cpyprint(expectedOtp)fname_check = fname.get()lname_check = lname.get()em_check = em.get()pwd_check = pwd.get()otp_check = otp.get()check_count = 0if fname_check == "":warn = "First name can't be empty!"else:check_count += 1if lname_check == "":warn = "Last name can't be empty!"else:check_count += 1if em_check == "":warn = "Email can't be empty!"else:check_count += 1if pwd_check == "":warn = "Password can't be empty!"else:check_count += 1if 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 appelse: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() 输出:
在上面的代码中,我们制作了一个注册表单,其中包含标签、按钮和条目等详细信息,该代码与数据库连接连接,该数据库连接添加真正的用户在此处注册。

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

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

Python tkinter 中的多个窗口
四、Python Tkinter 多页访问验证
在下一节中,我们将了解多页访问验证。
通过访问验证,我们的意思是验证用户的密码和在注册期间注册的电子邮件。我们还可以使用此代码中的创建帐户按钮注册用户。
代码:
登录 Page.py
现在,让我们看一下我们在此代码中使用的一些库是 sqlite3 和 Tkinter 库下的 messagebox。在这里,还使用了标签、字段、条目和按钮。
- un 用于用户名
- PD用于密码
- messagebox.showerror() 用于输入一些不正确的用户名和密码时,它会自动显示错误。
from tkinter import *
from tkinter import messagebox
import sqlite3try: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 registerdef submit():u = uname.get()p = pwd.get()check_counter=0if u == "":warn = "Username can't be empty"else:check_counter += 1if p == "":warn = "Password can't be empty"else:check_counter += 1if check_counter == 2:if (u == un and p == pd):ws.destroy()import appelse: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() 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 messageboxws = 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() 运行以下代码并单击“登录”按钮后,我们必须输入有效的用户名和密码。它会将我们重定向到另一个窗口并向我们显示以下消息。
此外,我们可以看到一个注销按钮,它将帮助我们退出页面。

输出
您可能还想阅读以下 Tkinter 教程。
相关文章:
Python Tkinter Multiple Windows 教程
一、说明 在这个Python Tkinter教程中,我们将学习如何在Python Tkinter中创建多个窗口,我们还将介绍与多个窗口相关的不同示例。而且,我们将介绍这些主题。 Python Tkinter multiple windows使用多个窗口的 Python Tkinter 用户注册Python Tk…...
【Arduino24】8*8点阵实验
硬件准备 8*8点阵:1个 旋钮电位器:1个 面包板:1块 杜邦线:若干 硬件连线 软件程序 //定义引脚 #define xKnob_pin A0 //x轴旋钮的引脚 #define yKnob_pin A1 //y轴旋钮的引脚 const int row_pin[8] { 6, 11, 10, 3, 17, 4…...
2023年09月数据库流行度最新排名
点击查看最新数据库流行度最新排名(每月更新) 2023年09月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…...
jenkins快速跑通helloworld任务
jenkins新建helloworld示例 左上角“新建任务” 输入名称,选择第一个创建: 可以选择众多执行脚本,这里选择shell: 随后弹出一个窗口,将下面脚本填入: #!/bin/bashecho start... for i in {1..10}doecho $i…...
win10中安装ros
参考: Windows 10上安装ROS noetic平台_windows ros noetic_高精度计算机视觉的博客-CSDN博客...
问道管理:光刻胶概念再度活跃,广信材料两连板,蓝英装备等涨停
光刻胶概念6日盘中再度活泼,截至发稿,扬帆新材、广信资料、蓝英配备“20cm”涨停,盛剑环境亦涨停,高盟新材涨超9%,同益股份、容大感光涨超5%。 值得注意的是,广信资料已连续两个交易日涨停。公司近来在成绩…...
InstructPix2Pix(CVPR2023)-图像编辑论文解读
文章目录 1.摘要2.背景3.算法3.1 生成多模态训练集3.1.1生成指令及成对caption3.1.2 依据成对的caption生成成对的图像 3.2 InstructPix2Pix 4.实验结果4.1基线比较4.2消融实验 5.结论 论文: 《InstructPix2Pix: Learning to Follow Image Editing Instructions》 …...
基于神经网络结合紫外差分光谱的二氧化硫浓度定量预测
基于神经网络结合紫外差分光谱的二氧化硫浓度定量预测 前言一、代码运行1. 解压数据2. 导包3. 读取数据4. 构建网络5. 设置优化器6. 模型训练7. 可视化loss8. 模型验证 二、结果展示三、总结作者简介 前言 二氧化硫(SO2)是一种常见的环境污染物ÿ…...
一个新工具 nolyfill
名字的意思, 我自己的理解 no(po)lyfill 正如它的名字, 不要再用补丁了, 当然这里说的是过时的补丁。 polyfill 是补丁的意思 为什么要用这个插件 文档原文: 当您通过安装最新的 Node.js LTS 来接受最新的功能和安全修复时,像eslint-plugin-import、…...
vue的第2篇 开发环境vscode的安装以及创建项目空间
一 环境的搭建 1.1常见前端开发ide 1.2 安装vs.code 1.下载地址:Visual Studio Code - Code Editing. Redefined 2.进行安装 1.2.1 vscode的中文插件安装 1.在搜索框输入“chinese” 2.安装完成重启,如下变成中文 1.2.2 修改工作区的颜色 选中[浅色]…...
Java之包装类的详细解析
包装类 5.1 概述 Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使…...
SpringBoot项目防止接口重复提交(简单拦截器实现方案)
基于SpringBoot框架来开发业务后台项目时,接口重复提交是一个常见的问题。为了避免这个问题,我们可以通过自定义拦截器实现一个后台拦截接口重复提交的功能,本文将介绍如何使用基于SpringBoot实现这个功能。 首先,我们需要引入一…...
C语言 数据结构与算法 I
C语言-数据结构与算法 C语言基础 因为之前写算法都是用C,也有了些C基础,变量常量数据类型就跳过去吧。 首先是环境,学C时候用Clion,C语言也用它写吧~ 新建项目,选C执行文件,语言标准。。。就先默认C99吧…...
PHP指定时间戳/日期加一天,一年,一周,一月
PHP指定时间戳加上1天,1周,1月,一年其实是不需要用上什么函数的!指定时间戳本身就是数字整型,我们只需要再计算1天,1周它的秒数相加即可! 博主搜索php指定时间戳加一天一年,结果许多…...
前端框架 vue-admin-template的搭建运行
一介绍 1.1 下载地址 vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 GitHub - PanJiaChen/vue-element-admin: :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin 1.2 node.js的安装 地址下载node.js 1.6版本 CNPM Binari…...
Git—版本控制系统
git版本控制系统 1、什么是版本控制2、常见的版本控制工具3、版本控制分类3.1、本地版本控制3.2、集中版本控制 SVN3.3、分布式版本控制 Git 4、Git与SVN的主要区别5、Git环境配置6、启动Git7、常用的Linux命令8、Git配置9、设置用户名与邮箱(用户标识,必…...
【MySQL基础|第一篇】——谈谈SQL中的DDL语句
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 前言ÿ…...
移动安全测试框架-MobSF WINDOWS 环境搭建
安装python python-3.11.5-amd64.exe 安装Win64OpenSSL-3_1_2.exe 安装VisualStudioSetup.exe github下载安装包 https://github.com/MobSF/Mobile-Security-Framework-MobSF/archive/refs/heads/master.zip GitHub - MobSF/Mobile-Security-Framework-MobSF: Mobile Secur…...
QT连接OpenCV库完成人脸识别
1.相关的配置 1> 该项目所用环境:qt-opensource-windows-x86-mingw491_opengl-5.4.0 2> 配置opencv库路径: 1、在D盘下创建一个opencv的文件夹,用于存放所需材料 2、在opencv的文件夹下创建一个名为:opencv3.4-qt-intall 文…...
使用 ElasticSearch 作为知识库,存储向量及相似性搜索
一、ElasticSearch 向量存储及相似性搜索 在当今大数据时代,快速有效地搜索和分析海量数据成为了许多企业和组织的重要需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎,为我们提供了一种优秀的解决方案。除了传统的文本搜索,El…...
win-acme证书自动续期架构深度解析:从故障排查到高可用部署
win-acme证书自动续期架构深度解析:从故障排查到高可用部署 【免费下载链接】win-acme Automate SSL/TLS certificates on Windows with ease 项目地址: https://gitcode.com/gh_mirrors/wi/win-acme 技术背景与挑战 在当今云原生和微服务架构盛行的时代&am…...
一骑红尘妃子笑,CodeBuddy 运荔枝
一骑红尘妃子笑,CodeBuddy 运荔枝故事背景:适逢荔枝盛产季节,圣人(唐玄宗)为博美人(杨贵妃)一笑,钦点"荔枝使",负责将荔枝从"岭南"(今广…...
HGTector2:微生物基因组水平基因转移检测的完整免费指南
HGTector2:微生物基因组水平基因转移检测的完整免费指南 【免费下载链接】HGTector HGTector2: Genome-wide prediction of horizontal gene transfer based on distribution of sequence homology patterns. 项目地址: https://gitcode.com/gh_mirrors/hg/HGTect…...
解决PARSEC 3.0安装中的常见问题:从gcc缺失到native输入配置
解决PARSEC 3.0安装中的常见问题:从gcc缺失到native输入配置 在性能测试和基准评估领域,PARSEC 3.0作为一套广泛使用的多线程基准测试套件,为研究人员和开发者提供了评估系统性能的强大工具。然而,在实际安装和配置过程中&#x…...
AI专著生成新玩法!掌握这些工具,快速产出高质量专业专著
学术专著写作挑战与 AI 辅助工具介绍 学术专著的根本价值在于其内容的系统性与内部逻辑的完整性,但这往往是写作中的一个重大挑战。相较于期刊论文专注于某个特定问题,学术专著必须构建一个包括绪论、理论框架、核心研究、应用拓展,以及结论…...
用Multisim复刻经典24秒篮球计时器:从555时钟到数码管显示的保姆级仿真教程
用Multisim复刻经典24秒篮球计时器:从555时钟到数码管显示的保姆级仿真教程 篮球比赛中那令人窒息的最后24秒倒计时,不仅是球员的决胜时刻,也是电子爱好者眼中完美的数字电路实践案例。本文将带你用Multisim从零搭建一个完整的24秒计时系统&a…...
如何快速上手LeaguePrank:英雄联盟段位修改工具完整实战指南
如何快速上手LeaguePrank:英雄联盟段位修改工具完整实战指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 还在为英雄联盟单调的段位显示感到无聊吗?LeaguePrank是一款开源工具,让你轻松修…...
ESP芯片烧录终极指南:5分钟掌握esptool.py完整操作流程
ESP芯片烧录终极指南:5分钟掌握esptool.py完整操作流程 【免费下载链接】esptool Serial utility for flashing, provisioning, and interacting with Espressif SoCs 项目地址: https://gitcode.com/gh_mirrors/es/esptool ESP芯片烧录工具esptool.py是Espr…...
利用快马平台十分钟搭建worldmonitor数据监控原型
最近在做一个全球数据监控的小项目,需要快速验证原型效果。传统开发流程从环境搭建到功能实现至少需要几天时间,但这次尝试用InsCode(快马)平台后,十分钟就搭出了可运行的worldmonitor原型。分享下具体实现思路和操作体验: 明确核…...
Qwen3-14B多场景落地指南:内容创作、编程辅助、教育问答一体化方案
Qwen3-14B多场景落地指南:内容创作、编程辅助、教育问答一体化方案 1. 开箱即用的私有部署方案 Qwen3-14B私有部署镜像为企业和开发者提供了一站式解决方案,无需复杂的环境配置即可快速启用大模型能力。这个经过深度优化的镜像专为RTX 4090D 24GB显存环…...
