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…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...