百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python GUI项目实战(八)修改密码(python重置密码)

off999 2024-09-26 16:09 34 浏览 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_pass

3. 用户密码写入文件

所有的用户登录信息都存储在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. 效果演示

最后

本节实现了用户账号的密码修改功能,本项目的主体功能已经相对完善了,但这毕竟只是一个练手的小项目,目前还存在很多不足。 比如:

  1. 应当引入数据库存储技术,文本文件存储效率低下;
  2. 我们当前的账户密码还是明文存储,很不安全,作为一个合格的账户管理系统应当具备密码的密文存储的功能;
  3. 我们应当对添加学生信息数据的规范性做校验;
  4. 应当添加管理员账户,具备管理普通用户的权限;
  5. 应当具备注册用户的功能,并且添加用户照片的功能。

这些功能都有待补充,后面有机会我会继续完善这个项目!接下来,我会陆续更新其它内容,感兴趣的小伙伴希望能点赞关注支持一下,嘻嘻~

另外本项目所有的源码、素材、数据源私信我免费获取,我们一起共同交流与学习!

相关推荐

大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍

“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...

电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器

在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...

设置了加密密码zip文件要如何打开?这几个方法可以试试~

Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...

大文件想要传输成功,怎么把ZIP文件分卷压缩

不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...

高效处理 RAR 分卷压缩包:合并解压操作全攻略

在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...

2个方法教你如何删除ZIP压缩包密码

zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...

速转!漏洞预警丨压缩软件Winrar目录穿越漏洞

WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...

文件解压方法和工具分享_文件解压工具下载

压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...

[python]《Python编程快速上手:让繁琐工作自动化》学习笔记3

1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...

Python内置tarfile模块:读写 tar 归档文件详解

一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...

使用python展开tar包_python拓展

类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...

银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留

近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...

ZIP文件怎么打开?2个简单方法教你轻松搞定!

在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...

Ubuntu—解压多个zip压缩文件.zip .z01 .z02

方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...

如何使用7-Zip对文件进行加密压缩

7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...

取消回复欢迎 发表评论: