【Python】手把手教你用tkinter设计图书管理登录UI界面(四)

上一篇:【Python】手把手教你用tkinter设计图书管理登录UI界面(三)-CSDN博客

下一篇:

本文主要阐述完成“用户密码找回”,诸位且看我如何实现吧!

为了方便使用“已注册用户数据库.txt”的数据,我直接继承上一篇文章实现功能的模块类:

图书管理系统项目.code.继承登录UI完善功能_2.LoginUI_two,并创建了Retrieve类,保存在“继承登录UI完善功能_3.py”模块(如下图)

运行结果

导入【图书管理系统项目.code.登录UI】模块
导入【图书管理系统项目.code.继承登录UI完善功能_1】模块
导入【图书管理系统项目.code.继承登录UI完善功能_2】模块
[['最帅周华', '123.com', '10086'], ['秃顶老王', '123456', '10000'], ['法外狂徒张三', 'good_boy', '10010']]
找回成功

继承登录UI完善功能_3.py

"""继承登录UI完善功能_3 模块
"""# 通配符 '*'
__all__ = ['Retrieve']import re, time
import tkinter as tk
from tkinter import ttk
import tkinter.messagebox as tkmbfrom 图书管理系统项目.code.继承登录UI完善功能_2 import LoginUI_twoclass Retrieve(LoginUI_two):"""继承LoginUI_two,设计用户密码找回"""def __init__(self):"""构造方法"""# 调用LoginUI的构造方法super().__init__()# 设计用户密码找回# 找回按钮self.retrieveButton.config(command=self.passwordRetrieve)# 用户密码找回def passwordRetrieve(self):# 设计窗口self.retrieveUI = tk.Toplevel(self)self.retrieveUI.title('用户密码找回')self.retrieveUI.geometry(f'600x375+{self.width//4}+{self.height//8}')self.retrieveUI.resizable(0, 0)      # 窗口大小禁止调节self.retrieveUI.focus_force()        # 窗口焦点self.withdraw()  # 隐藏主窗口(登录UI)# 输入格式错误提示self.retrieve_hintLabel = tk.Label(self.retrieveUI, text='输入格式错误提示', width=20)# self.retrieve_hintLabel.place(x=155, y=55)# 用户名tk.Label(self.retrieveUI, text='用  户 名').place(x=100, y=100)# 用户名输入框self.retrieve_userVar = tk.StringVar()if self.userName.get() != '请输入用户名': self.retrieve_userVar.set(self.userName.get())self.retrieve_userEntry = ttk.Entry(self.retrieveUI, textvariable=self.retrieve_userVar)self.retrieve_userEntry.place(x=160, y=100)# 手机号码tk.Label(self.retrieveUI, text='手机号码').place(x=100, y=150)# 手机号码输入框self.retrieve_phoneVar = tk.StringVar()self.retrieve_phoneEntry = ttk.Entry(self.retrieveUI, textvariable=self.retrieve_phoneVar)self.retrieve_phoneEntry.place(x=160, y=150)# 验证码tk.Label(self.retrieveUI, text='验  证 码').place(x=100, y=200)# 验证码输入框self.retrieve_inputVerifyVar = tk.StringVar()self.retrieve_verifyEntry = ttk.Entry(self.retrieveUI, width=9, textvariable=self.retrieve_inputVerifyVar)self.retrieve_verifyEntry.place(x=160, y=200)# 获取验证码self.retrieve_showVerifyVar = tk.StringVar(value='获取验证码')self.retrieve_verifyButton = ttk.Button(self.retrieveUI, width=9, textvariable=self.retrieve_showVerifyVar,command=lambda: self.retrieve_showVerifyVar.set(self.getVerifyCode()))self.retrieve_verifyButton.place(x=234, y=198)# 确认self.retrieve_confirmButton = ttk.Button(self.retrieveUI, text='确认', command=self.confirmRetrieve)self.retrieve_confirmButton.place(x=100, y=250)# 取消(没有头绪设计)self.retrieve_cancelButton = ttk.Button(self.retrieveUI, text='取消')self.retrieve_cancelButton.place(x=220, y=250)# 返回self.retrieve_returnButton = ttk.Button(self.retrieveUI, text='返回', command=self.retrieveUI_return)self.retrieve_returnButton.place(x=460, y=320)# 窗口关闭触发self.retrieveUI.protocol("WM_DELETE_WINDOW", self.retrieveUI_return)# 确认找回密码def confirmRetrieve(self):# print([self.retrieve_userVar.get(),self.retrieve_phoneVar.get(),self.retrieve_inputVerifyVar.get(),self.retrieve_showVerifyVar.get()])# 如果用户数据为空if not self.userData:self.bell()         # 警告声self.retrieve_hintLabel.config(text='恭喜您是首位用户\n  快来注册体验吧!', background='pink')  # 输入错误提示语self.retrieve_hintLabel.place(x=155, y=55)  # 显示错误提示标签内容self.retrieveUI.update()                    # 窗口更新time.sleep(1)                               # 睡眠1秒self.retrieve_hintLabel.place_forget()      # 隐藏错误提示标签内容return# 查找用户名是否已注册for name in self.userData:# 如果已注册if name[0] == self.retrieve_userVar.get():# 验证手机号码是否正确if name[2] == self.retrieve_phoneVar.get():# 判断验证码是否正确if re.findall(self.retrieve_showVerifyVar.get(), self.retrieve_inputVerifyVar.get(), re.I)\and self.retrieve_showVerifyVar.get() != '获取验证码':# 登录成功print('找回成功')self.retrieve_password(name)return# 验证码错误else:self.retrieve_verifyButton.focus()  # 设置焦点self.retrieve_hintLabel.config(text='验证码输入错误', background='red')  # 输入错误提示语break# 手机号码错误else:self.retrieve_phoneEntry.focus_set()  # 设置焦点self.retrieve_hintLabel.config(text='手机号码输入错误', background='red')  # 输入错误提示语break# 用户名错误elif name == self.userData[-1]:self.retrieve_userEntry.focus()  # 设置焦点self.retrieve_hintLabel.config(text='用户名输入错误', background='red')  # 输入错误提示语# 警告声与更新验证码self.bell()  # 警告声self.retrieve_showVerifyVar.set('获取验证码')self.retrieve_hintLabel.place(x=155, y=55)  # 显示错误提示标签内容self.retrieveUI.update()                    # 窗口更新time.sleep(1)                               # 睡眠1秒self.retrieve_hintLabel.place_forget()      # 隐藏错误提示标签内容# 找回用户密码def retrieve_password(self, name):self.retrieveUI.bell()  # 警告声# 禁止窗口使用self.retrieveUI.attributes("-disabled", True)# 确认是否if tkmb.askokcancel('密码成功找回', f'您的账户信息如下:{" "*50}\n用户名: {name[0]}\n密    码: {name[1]}\n绑定手机号码: {name[2]}'f'\n\n是否返回登录?', parent=self.retrieveUI):# 恢复窗口使用self.retrieveUI.attributes("-disabled", False)# 返回登录UIself.retrieveUI_return()return# 恢复窗口使用self.retrieveUI.attributes("-disabled", False)self.retrieve_showVerifyVar.set('获取验证码')self.retrieveUI.focus_force()  # 窗口焦点# 返回登录UIdef retrieveUI_return(self):self.deiconify()            # 显示主窗口(登录UI)self.retrieveUI.destroy()   # 销毁当前窗口if self.retrieve_userVar.get() != self.userName.get():self.userName.set(self.retrieve_userVar.get())self.userEntry.config(foreground='black')# 初始化数据self.password.set('')self.inputVerifyCode.set('')self.showVerifyCode.set('获取验证码')self.showOrConcealCount = 0  # 默认是密码隐藏# 代码测试
if __name__ == '__main__':ui = Retrieve()         # 对象实例化ui.mainloop()           # 窗口主循环
else:print(f'导入【{__name__}】模块')

作者:周华

创作日期:2023/12/12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt有哪些常用控件

Qt 是一个跨平台的应用程序开发框架,提供了许多不同类型的控件来构建用户界面。以下是一些常见的 Qt 控件: 按钮(Button):用于执行操作或触发事件。文本框(TextBox):用于输入和显示文…

Windows 11安装xray

需要先安装python,我这里已经安装好了,在命令行里边使用python --version可以看到自己的python版本。 xray的下载网址为https://github.com/chaitin/xray/releases,我根据自己的笔记本电脑配置,选择下载xray_windows_amd64.exe.…

静态代理,JDK动态代理,CGLIB代理原理详解

学习代理前要对反射有一定的了解 代理: 代理是一种设计模式,代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端与真实对象之间的中介,它可以在客户端和真实对象之间添加…

MySQL笔记-第08章_聚合函数

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第08章_聚合函数1. 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和MAX函数1.3 COUNT函数 2. GROUP BY2.1 基本使用2.2 使用多个列分组2.3 GROUP BY中…

100天精通Python(可视化篇)——第110天:Pyecharts绘制可视化大屏项目(附上完整源码)

文章目录 专栏导读1. 数据准备2. 绘制地图3. 绘制折线图4. 绘制柱状图5. 绘制饼图6. 创建网格组合所有图标7. 创建时间轴8. 完整代码书籍推荐专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,…

现代雷达车载应用——第2章 汽车雷达系统原理 2.2节

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.2 汽车雷达架构 从顶层来看,基本的汽车雷达由发射器,接收器和天线组成。图2.2给出了一种简化的单通道连续波雷达结构[2]。这…

代码随想录算法训练营第五十二天| 300 最长递增子序列 674 最长连续递增子序列 718 最长重复子数组

目录 300 最长递增子序列 674 最长连续递增子序列 718 最长重复子数组 300 最长递增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int>dp(nums.size(),1);//以i结尾的最长递增子序列的长度for(int i 0;i < nums.size()…

Excel——TEXTJOIN函数实现某一列值相等时合并其他列

一、TEXTJOIN函数介绍 公式TEXTJOIN(分隔符, 忽略空白单元格, 字符串1…) 分隔符&#xff1a;文本字符串&#xff0c;或者为空&#xff0c;或用双引号引起来的一个或多个字符&#xff0c;或对有效文本字符串的引用。如果提供一个数字&#xff0c;则将被视为文本。 忽略空白单…

Python 神奇解码器:pyWhat 库全面指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今数字化的世界中&#xff0c;理解和处理文本数据是许多应用程序的关键任务。而PyWhat库作为一个用于处理文本的Python库&#xff0c;提供了强大的功能&#xff0c;帮助开发者在文本中识别和提取有意义的信息…

deepface:实现人脸的识别和分析

deepface介绍 deepface能够实现的功能 人脸检测&#xff1a;deepface 可以在图像中检测出人脸的位置&#xff0c;为后续的人脸识别任务提供基础。 人脸对齐&#xff1a;为了提高识别准确性&#xff0c;deepface 会将检测到的人脸进行对齐操作&#xff0c;消除姿态、光照和表…

青蛙跳台阶(C语言)

1.代码: 2.问题:青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法&#xff1f; 3.答案: 我们用递归方法来解题: 秉持着大事化小原则: 假设让青蛙跳上一个台阶,那么还有(n - 1)个台阶要跳 假设让青蛙跳上二个台阶,那么还…

包装类 和 初阶泛型(详解)

【本节目标】 1. 以能阅读 java 集合源码为目标学习泛型 2. 掌握包装类 3. 掌握泛型 1. 包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 除了Integer和Charact…

二百一十六、Flume——Flume拓扑结构之负载均衡和故障转移的开发案例(亲测,附截图)

一、目的 对于Flume的负载均衡和故障转移拓扑结构&#xff0c;进行一个开发测试 二、负载均衡和故障转移 &#xff08;一&#xff09;结构含义 Flume支持使用将多个sink逻辑上分到一个sink组 &#xff08;二&#xff09;结构特征 sink组配合不同的SinkProcessor可以实现负…

SpringBoot--入门使用

目录 SpringBoot简介 什么是SpringBoot 相比Spring&#xff0c;SpringBoot的有哪些特点 SpringBoot入门使用 创建SpringBoot项目 配置项目名称 启动SpringBoot SpringBoot整合依赖&#xff0c;配置开发环境 SpringBoot整合jdbc SpringBoot整合mybatis 配置开启log日志…

隔离电源与非隔离式电源

开关电源 文章目录 开关电源前言一、它们之间的区别是什么&#xff1f;二、如何区分它们呢&#xff1f;三、隔离电源与非隔离电源的优缺点四、隔离电源与非隔离电源的选择总结 前言 在产品设计时&#xff0c;倘若没有考虑应用环境对电源隔离的要求&#xff0c;产品到了应用时就…

Linux服务器安装vim命令

1、查看是否安装vim命令 vim /etc/hosts2、检查系统中是否存在安装包 rpm -qa|grep vim2、 安装vim yum -y install vim*4、测试是否安装成功 vim /etc/hosts

linux交换分区管理SWAP

概念查看当前的交换分区&#xff1a;free 6.2.5 交换分区管理SWAP 6.2.5.1 概念 作用&#xff1a; ”提升“内存容量&#xff0c;防止OOM&#xff08;out of memory&#xff0c;内存溢出&#xff09;。 ​ 对应windows中的虚拟内存。 ​ 从功能上讲&#xff0c;交换分区主要是…

Java进阶 1-1 枚举

目录 枚举的基本特性 枚举类型中的自定义方法 switch语句中的枚举 编译器创建的values()方法 使用实现代替继承 构建工具&#xff1a;生成随机的枚举 组织枚举 EnumSet EnumMap 本笔记参考自&#xff1a; 《On Java 中文版》 枚举类型通过enum关键字定义&#xff0c;其…

【从零开始学习JVM | 第六篇】快速了解 直接内存

前言&#xff1a; 当谈及Java虚拟机&#xff08;JVM&#xff09;的内存管理时&#xff0c;我们通常会想到堆内存和栈内存。然而&#xff0c;还有一种被称为"直接内存"的特殊内存区域&#xff0c;它在Java应用程序中起着重要的作用。直接内存提供了一种与Java堆内存和…

三天搞定jmeter入门到入职全套教程之使用Jmeter录制脚本

相对于LoadRunner跟SilkPerformer来说&#xff0c;Jmeter确实有差距&#xff0c;但毕竟前两者太贵&#xff0c;Jmeter胜在免费开源。 先看下LoadRunner录制的脚本如下&#xff0c;美如画&#xff0c;结构清晰&#xff0c;易于修改编辑&#xff0c;比如做关联等。当然目前LoadR…