Python GUI项目实战(八)修改密码(python重置密码)
off999 2024-09-26 16:09 46 浏览 0 评论
前言
上一节Python GUI项目实战(七)给系统添加修改和删除的功能 中,我们完成了学生信息的修改删除和保存功能,本项目的基础功能已经基本完善了,但是我们还需要添加一个修改用户密码的功能,即用户登录后可以修改自己的登录密码。
一、修改密码GUI的设计
首先我们创建一个py文件changepasswordgui.py先绘制实现修改密码功能的界面。
1. 要求
- 主体框架与明细窗体保持一致;
- 能够读取当前用户名、验证旧密码、设置新密码、确认新密码的功能;
- 输入密码时输入框显示的内容为 * 号
- 当前用户名只显示数据,不可修改
2. 方法
(1)修改密码的窗体我们大部分代码可以直接使用明细窗体的代码,只需在关键的部分做一些修改即可;
(2)输入密码显示*,我们可以给Entry对象添加一个show参数,其值设为*;
(3)显示当前用户名的Entry对象我们设置为只读状态,只需添加一个state参数,其值设为DISABLE即可。
from tkinter import *
from tkinter.ttk import *
from tkinter.messagebox import *
import os
class ChangePasswordWindow(Toplevel):
def __init__(self):
super().__init__()
self.title("修改密码")
self.geometry("600x500+600+150")
self.resizable(0,0) # 不能改变大小
# 加载界面
self.setup_UI()
def setup_UI(self):
# 设置style
self.Style01 = Style()
self.Style01.configure("title.TLabel", font=("微软雅黑", 25, "bold"), foreground="navy")
self.Style01.configure("TLabel", font=("微软雅黑", 20, "bold"), foreground="navy")
self.Style01.configure("TButton", font=("微软雅黑", 16, "bold"), foreground="navy")
self.Style01.configure("TEntry", font=("微软雅黑", 16, "bold"), width=10)
self.Style01.configure("TRadiobutton", font=("微软雅黑", 16, "bold"), foreground="navy")
# 加载上面的banner
self.Login_image = PhotoImage(file="." + os.sep + "img" + os.sep + "stu_detail_banner.png")
self.Label_image = Label(self, image=self.Login_image)
self.Label_image.pack()
# 添加一个title
self.Label_title = Label(self, text="==修改密码==", style="title.TLabel")
self.Label_title.place(x=360, y=20)
# 加载一个pane
self.Pane_detail = PanedWindow(self, width=590, height=380)
self.Pane_detail.place(x=5, y=88)
# 账号
self.Label_login = Label(self.Pane_detail,text = "当前用户名:")
self.Label_login.place(x=160,y=70)
self.var_login = StringVar()
self.Entry_login = Entry(self.Pane_detail,state=DISABLED,textvariable = self.var_login, font=("微软雅黑", 18, "bold"),width = 12)
self.Entry_login.place(x=280,y=68)
# 旧密码
self.Label_old_password = Label(self.Pane_detail, text="验证旧密码:")
self.Label_old_password.place(x=160, y=120)
self.var_old = StringVar()
self.Entry_old_password = Entry(self.Pane_detail, show="*",textvariable=self.var_old, font=("微软雅黑", 18, "bold"), width=12)
self.Entry_old_password.place(x=280, y=118)
# 新密码
self.Label_new_password = Label(self.Pane_detail, text="设置新密码:")
self.Label_new_password.place(x=160, y=170)
self.var_new = StringVar()
self.Entry_new_password = Entry(self.Pane_detail, show="*",textvariable=self.var_new, font=("微软雅黑", 18, "bold"), width=12)
self.Entry_new_password.place(x=280, y=168)
# 确认新密码
self.Label_two_new_password = Label(self.Pane_detail, text="确认新密码:")
self.Label_two_new_password.place(x=160, y=220)
self.var_two_new = StringVar()
self.Entry_two_new_password = Entry(self.Pane_detail, show="*",textvariable=self.var_two_new, font=("微软雅黑", 18, "bold"), width=12)
self.Entry_two_new_password.place(x=280, y=218)
# 放置两个按钮
self.Button_save = Button(self, text="保存", style="TButton")
self.Button_save.place(x=300, y=472)
self.Button_exit = Button(self, text="关闭", style="TButton")
self.Button_exit.place(x=450, y=472)3. 效果演示
二、修改密码前的准备
1. 数据传递的思路
因为用户自己只能更改自己的密码,所以当前用户名在修改密码窗体加载的时候就应该自动填充进去。 由于只有在登录窗体才能获取到当前用户名和密码,主窗体需要显示用户名、修改密码窗体需要显示用户名和校验旧密码。所以我们必须想办法将用户名密码由登录窗体传至主窗体再传至修改密码窗体。 在登录窗体的构造函数中添加全局变量
self.current_user_list = []用于存储当前用户的用户名、密码、状态信息 然后在login()函数身份验证成功后,可以直接将user_list[index]存入current_user_list中。
self.current_user_list = self.user_list[index]之后,我们在加载主窗体的函数load_main()中,将参数设置为self.current_user_list和self.get_now_time;
main_window = maingui.MainWindow(self.current_user_list,self.get_now_time())在主窗体中,构造函数中的参数设置为current_user_list和current_time,并添加一个全局变量
self.current_login_list = current_user_list接着把self.current_login_list作为参数传递给构造修改密码的窗体中。 与此同时修改密码窗体的构造函数也要添加参数用来接收用户列表current_login_list,并且定义全局变量
self.current_login_list = current_login_list当修改密码窗体接收到用户列表数据后,在构造函数中就可以直接设置当前登录的用户名,在Entry_login中显示出来。
# 初始化当前用户
self.var_login.set(self.current_login_list[0])2. 修改密码前的判断
修改密码需要有以下条件:
- 旧密码是否正确
- 新旧密码不允许相同
- 新密码不许为空
- 两次输入新密码是否一致
在修改密码窗体中,我们分别给保存和关闭两个按钮绑定方法commit()和close_window()
def commit(self):
# 获取输入的值
old_pass = self.var_old.get()
new_pass = self.var_new.get()
new_two = self.var_two_new.get()
# 判断旧密码输入是否正确
if old_pass != self.current_login_list[1]:
showinfo("系统提示","旧密码错误")
return
if new_pass == old_pass:
showinfo("系统提示","新密码和旧密码一样!系统不允许")
return
if len(new_pass.strip()) == 0:
showinfo("系统提示","新密码不许为空")
return
if new_pass != new_two:
showinfo("系统提示","两次新密码不一致!")
return
def close_window(self):
self.destroy()这样我们实现了密码前的判断,紧接着我们就要继续实现密码的修改和写入到文件中。
三、写入到文件
由于我们只能读取到当前用户的密码信息,如果直接写入到文件,其它用户的信息就会丢失。所有我们必须想办法读取到其它用户的用户信息和密码。
1. 读取其它用户登录信息
我们之间从文件中读取所有的用户信息 定义一个全局变量file_path存储用户信息的文件路径,还有一个全局变量all_login_list存储所有的用户登录信息。
self.file_path = "/Users/yushengtan/Desktop/Demo/Studentmgr/User.txt"
self.all_login_list = [] # 存储所有的用户登录信息接着我们定义一个方法get_all_login,获取所有的用户登录信息,和登录窗口类似,通过对文件的读取将所有的用户信息存储在all_login_list中
def get_all_login(self):
if not os.path.exists(self.file_path):
showinfo("系统消息","提供的文件名不存在!")
else:
try:
with open(file = self.file_path,mode = "r") as fd:
# 一次读一行
current_line = fd.readline()
while current_line:
temp_list = current_line.split(",") # 长字符串分割层三个
self.all_login_list.append(temp_list)
# 读取下一行,读完了循环就结束了
current_line = fd.readline()
except:
showinfo("系统消息","文件读取出现异常!")接着我们在构造方法中添加这个方法,当这个窗体被打开时自动执行该方法把所有的用户登录信息存储在all_login_list中。
2. 正式修改密码
在commit()方法中,对所有的用户登录信息进行遍历如果所有的用户信息的用户名与当前登录的用户名一致则执行修改操作。
# 修改密码
for index in range(len(self.all_login_list)):
if self.all_login_list[index][0] == self.current_login_list[0]:
self.all_login_list[index][1] = new_pass3. 用户密码写入文件
所有的用户登录信息都存储在User.txt文件中,对其修改,我们所采取的方案是先清空文件,再将all_login_list列表中的数据写入到文件中。注意去除换行符带来的干扰。
try:
with open(self.file_path,mode="w") as fd:
fd.write("")
with open(self.file_path,mode="a") as fd:
for item in self.all_login_list:
temp = ",".join(item)
temp = temp.replace("\n","")+"\n"
fd.write(temp)
except:
showinfo("系统消息","写入文件出现异常")至此,我们用户密码的修改功能就已经实现了!
4. 效果演示
最后
本节实现了用户账号的密码修改功能,本项目的主体功能已经相对完善了,但这毕竟只是一个练手的小项目,目前还存在很多不足。 比如:
- 应当引入数据库存储技术,文本文件存储效率低下;
- 我们当前的账户密码还是明文存储,很不安全,作为一个合格的账户管理系统应当具备密码的密文存储的功能;
- 我们应当对添加学生信息数据的规范性做校验;
- 应当添加管理员账户,具备管理普通用户的权限;
- 应当具备注册用户的功能,并且添加用户照片的功能。
这些功能都有待补充,后面有机会我会继续完善这个项目!接下来,我会陆续更新其它内容,感兴趣的小伙伴希望能点赞关注支持一下,嘻嘻~
另外本项目所有的源码、素材、数据源私信我免费获取,我们一起共同交流与学习!
相关推荐
- win10版本回退(win10回退到以前版本)
-
如果你想在Windows10系统中回退到上一个版本,可以按照以下步骤进行操作:1.打开设置:点击Windows开始按钮,然后点击屏幕左侧的“设置”图标,或者使用键盘快捷键Win+I打开设置。2...
- 营业厅一个路由器多少钱(上门更换路由器收费吗)
-
移动免费装宽带活动全国都在搞,不过免费是有“门槛”的。以我所在的地区为例,只有月费在78元及以上的大流量套餐用户,才可以享受免费安装移动的宽带。月费越高,宽带的速率也越高,148元档可以安装200M的...
- win10从u盘启动怎么设置(win10怎么从u盘启动电脑)
-
1.回到桌面。点击开始徽标,点击开始菜单左侧的设置。2.设置界面点击更新和安全。3.进入更新和安全界面,点击左侧的恢复选项。4.进入恢复界面,点击高级启动下面的立即重新启动。5.插入自己的U盘,等待...
- 系统大全网站(系统大全网站推荐)
-
下载时发生错误可能是以下原因:1.你的网速过慢,网页代码没有完全下载就运行了,导致不完整,当然就错误了。请刷新。2.网页设计错误,导致部分代码不能执行。请下载最新的遨游浏览器。3.你的浏览器不兼容导致...
- win10官方启动盘(win10官方启动盘怎么用)
-
1、在开始菜单搜索“设置”,打开“设置”;2、点击“更新与安全”,在左侧菜单栏点击“恢复”;3、点击“启动项”,在弹出的窗口中会显示当前可以启动的项目,点击“编辑”;4、在打开的“编辑启动项”窗口中,...
- win10系统安装不了(win10 安装不了)
-
电脑装不上win10系统可能是因为以下几个原因导致的原因一:win10安装文件不对我们在安装win10之前,要确保下载到安装包真实可用的,否则安装肯定会有问题,建议下载安全可靠的安装包!原因二:系统文...
- 国内dns哪个最快(dns开启好还是关闭好)
-
移动dns设置首选114.114.114.114,它又好又快。首选DNS和备用DNS都是一种域名系统,这两种域名系统有着先后之分,如果在首选DNS正常的情况下,就用首选DNS地址。当首选DNS服务器出...
- winxp安装盘(winxp系统安装)
-
xp系统安装步骤如下1、将下载的xp系统iso压缩包文件下载到C盘之外的分区,比如下载到D盘,右键使用WinRAR等工具解压到当前文件夹或指定文件夹,不能解压到C盘和桌面,否则无法安装;?2、解压之后...
- 现在的win11稳定了吗(win11稳定嘛)
-
windows10更稳定,由于win11刚刚推出没多久,稳定差不够好,兼容性也有待提升,无论是应用还是游戏都会遇到不明程度的问题,因此,在日常的使用过程中,我们还是应当以稳定性为优先,选择win10是...
- xp安装包下载到手机(xp系统安装包)
-
手机是基于ARM架构的处理器,而WindowsXP是基于x86架构的操作系统,因此无法直接在手机上安装WindowsXP。除非您的手机是使用Intel处理器,但这种情况非常罕见。如果您需要在手机上...
- 如何查看硬盘序列号(windows如何查看硬盘序列号)
-
1.打开开始菜单栏,输入【cmd】点击【确定】;2.在命令窗口依次输入【diskpart】-【listdisk】-【selectdisk0】;3.选好要查看的硬盘后,接着输入【detaildi...
- 虚拟机安装win7教程(虚拟机安装win7教程图解)
-
1.首先,下载并安装虚拟机软件,如VMwareWorkstation、VirtualBox等。2.打开虚拟机软件,创建一个新的虚拟机。3.在创建虚拟机的过程中,选择安装Windows7专业版的IS...
- 系统脱敏法的操作程序如何
-
系统脱敏疗法(systematicdesensitization)又称交互抑制法,是由美国学者沃尔普创立和发展的。这种方法主要是诱导求治者缓慢地暴露出导致神经症焦虑、恐惧的情境,并通过心理的放松状态...
- 闪迪u盘低级格式化工具(闪迪u盘格式化分配单元大小)
-
闪迪U盘格式化后速度变慢的可能原因及解决方法如下:文件系统问题:格式化时选择的文件系统类型可能会影响U盘的性能。常见的文件系统类型包括FAT32、NTFS和exFAT等。如果文件系统类型不合适,可能会...
- psd文件下载(psd格式下载网站)
-
1、在photoshop中,不能通过置入的方法来加载PSD文件,因为,通过置入的方法加载PSD文件,它是以合并图层的方法把PSD文件加入,这样,就失去了PSD文件的所有图层信息。 2、在文档中想...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
