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…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...