用Python实现学生管理系统!(详细教程)

embedded/2024/10/22 17:22:51/

在文章开始前打个小广告——分享一份Python学习大礼包(激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程)点击领取,100%免费!

学生信息管理系统的开发

模块: 1. 系统登录界面 --> logingui.py

         2. 系统主界面     -->    maingui.py3. 学生明细界面  -->   detailgui.py 4. 修改登录账号密码界面 -->  changepassword.py5. GUI界面需要的图库6. 数据   -->   (1) 登录账号相关文件 (loginuser\_info.txt)        (2) 加载到主界面中显示的学生信息文件(student\_info.txt)

图片部分

注意: 这里的图片全部是png格式的 代码中窗体小图标是ico格式的可以通过网上转换图片生成ico格式的图片

文件部分

student_info.txt

python">95001,橘右京,20,,15977693796,juyoujing@yahoo.cn.jp,日本大阪府大阪市,1988/9/12,110103199110186521,2010618,战士,橘子成精,18911213348
95002,韩信,19,,18695719656,www.hanxin163.com,陕西省西安市韩台镇韩家村196,1990/5/30,610103199110182714,2010218,刺客,韩悠悠,15977693321
95003,亚瑟,30,,15834769921,yase@chengxin196.com,美国卡里福尼亚州,1981/7/21,370626798909071691,1978717,战士,亚历山大三世,18955789581
95004,王昭君,18,,18977623571,wangzhaojun@qq.com,江苏省苏州市姑苏区,1998/12/3,320506198911112836,2014930,法师,王他爹,17966289971
95005,阿珂,17,,13644893365,jingke@qq.com,山东省烟台市芝罘区,2000/3/23,370602198909071333,199999,刺客,阿可可,15855372291
95006,白起,28,,15962789930,www.baiqi@163.com,陕西省西安市,1978/12/31,610103199110182255,19781230,战士,白斩,18633462237
95007,苏烈,37,,18912347689,sulie@yahoo.cn.jp,辽宁省黑龙江市,1975/9/30,3205061989167810056,1971812,战士,苏醒,15977889900
95008,虞姬,18,,15942887540,www.yuji\_s@qq.com,江苏省苏州市,1999/6/10,320506198911110056,1998228,射手,虞阵子,15890017789
95009,鲁班,16,,18856713396,luban250@163.com,河南省郑州市,2001/5/7,3865198911110011,20011212,射手,鲁班大师,15977889911
95010,狄仁杰,20,,18867321541,direnjie@alibaba.com,江苏省杭州市,1996/10/30,32050619891230056,199821,射手,狄小兵,15778890071
95011,东方曜,21,,15855667913,dongfangyao@qq.com,陕西省西安市,1997/10/24,610103199110181412,20081106,战士,东方朔,18977239971
95012,嬴政,29,,15588988888,yingzheng@beifeng.com,陕西省西安市,1981/4/12,610103199110182079,1999531,法师,嬴政他爹,18857613374
95013,蔡文姬,20,,18666890013,caicai@alibaba.com,云南省大理市,1997/10/16,320506156911110056,19981127,辅助,蔡铭,18758092231
95014,甄姬,24,,18562782278,www.zhenji@163.com,山西省大同市,1994/12/1,320506198911110056,1997430,法师,甄子丹,16599002345
95015,宫本武藏,27,,18977889900,juyoujing@yahoo.cn.jp,日本大阪府大阪市,1982/3/19,3205061989112346,1982221,战士,宫本重生,17971889920
95016,明世隐,30,,18662722447,www.mingshiyin@163.com,湖南省荆州市,1977/11/11,320506198911110216,1971228,辅助,明世隐公子,15888990011
95017,李元芳,17,,15727458228,liyuanfang@ibm.com,湖北省武汉市,1999/12/11,32050619891111112234,200478,射手,李元直,1857789012237
95018,盾山,37,,18677882288,www.dunshan@qq.com,山东省烟台市,1975/12/12,370602198909071472,1978517,辅助,盾地,15888887777
95019,诸葛亮,24,,18911118888,zhugeliang@qq.com,湖南省荆州市,1996/6/8,320506198911223344,1998911,法师,诸葛苏,15777812910
95020,赵云,27,,18889966657,zhaozilong@qq.com,河南省荆州市,1993/12/12,320506198922331005,19891028,战士,赵形,167877889109
95021,关羽,29,,18811007788,guanyu@yahoo.com,山东省烟台市,1981/12/14,3706021989090704371990112,战士,关包,13877639961
95022,不知火舞,18,,18677120091,huwu@yahoo.co.jp,日本东京,1997/2/14,370602199702141471,202041,法师,安迪,18612416097
95023,张飞,28,,15811221190,zhangfei@qq.com,河南省郑州市,1985/1/30,320506198501301014,202011,坦克,刘备,15988002581

loginuser_info.txt

python">liupeng,P@ssw0rd,1
admin,123.com,0
zhangsan,123.com,0

一,系统登录界面

思路:

  1. GUI界面的设计 --> 通过python自带的 tkinter 及 tkinter的加强版 tkinter.ttk 来实现登录界面的部署 (编码部署界面 --> 原因:为了日后习惯web开发)

  2. GUI界面下通过用户名密码进行身份验证 --> 读取到文件中的用户信息存入集合 --> 集合中通过元素[0][1][2]的方式管理学生信息的用户名,密码及锁定状态

  3. 用户登录判定:
    (1) 判断登录用户是否被锁定
    (2) 判断登录用户是否存在
    (3) 判断登录用户密码输入是否正确
    (4) 判断登录用户密码登录是否超过3次,3次判定为锁定并写入到文件

代码实现:

python">from tkinter import \*
import tkinter.ttk as ttk
import os
from tkinter.messagebox import \*
from datetime import datetime
import wangzhexiagu.GUI\_student\_system.maingui as manclass Login\_Windows(Tk):def \_\_init\_\_(self):"""主构造函数1. 初始化登录界面窗体2. 布局登录窗体并配置各个按键的属性3. 实现用户验证功能"""super().\_\_init\_\_()  #初始化框口self.title("登录界面")self.geometry("640x420+300+200") #通过控制图像大小可以通过+号来调整窗体出现的位置self.resizable(0,0) #固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0self.iconbitmap(R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\photo\\china.ico")#添加图片背景色self\["bg"\] = "RoyalBlue" #传统tkinter中配置颜色方法#加载窗体self.SetUp\_UI()#设置全局变量self.file\_path = R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\loginUserInfo\_Data\\loginuser\_info.txt"self.user\_list \= \[\] #用户存储读取文件中所有的元素self.misspasswd\_counter = 0 #记录password错误的次数self.input\_user = "" #记录当前用户self.input\_password = "" #记录当前用户密码self.current\_login\_list = \[\] #存储登录的账号和密码#自动执行文件中文件的加载self.load\_localfile\_info()#showinfo(message=self.user\_list) #通过该提示可以直接看文件是否被读取成功!#设置GUI页面窗体及控件的布局def SetUp\_UI(self):#通过style设置属性self.Style01 = ttk.Style()self.Style01.configure("TLabel",font=("微软眼黑",18,"bold"),background = "RoyalBlue",foreground = "white")self.Style01.configure("TButton", font=("微软眼黑", 11), background="RoyalBlue", foreground="black")#加载窗体图片self.login\_img = PhotoImage(file =R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\photo\\school\_demo.png")self.label\_img \= ttk.Label(self,image = self.login\_img)self.label\_img.pack(padx \= 10,pady = 10)#创建Label + Entry ----用户名self.username = ttk.Label(self,text = "用户名")self.var\_user \= StringVar() #为了获取键盘输入self.username.pack(side = LEFT,padx = 10, pady = 10)self.user\_entry \= ttk.Entry(self,width = 15,textvariable =self.var\_user,font=("微软眼黑",13,"bold"))# bold代表字体粗体self.user\_entry.pack(side = LEFT,padx = 10, pady = 10)#创建Label + Entry ----密码self.password = ttk.Label(self,text = "密码")self.var\_password \= StringVar()#为了获取键盘输入self.password.pack(side = LEFT,padx = 10, pady = 10)self.password\_entry \= ttk.Entry(self,show = "\*",width = 15,textvariable=self.var\_password,font=("微软眼黑",13,"bold")) #show方法代表密码密文self.password\_entry.pack(side = LEFT,padx = 10, pady = 10)#创建Button ---- 登录self.button\_login = ttk.Button(self,text = "登录",command = self.login)self.button\_login.pack(side \= LEFT,padx = 10, pady = 10)def load\_localfile\_info(self):"""加载本地文件:通过readline()方法一次读取一行的方式进行读取(避免日后文件过大一次性读取的弊端):return:"""if not os.path.exists(self.file\_path):showinfo("系统提示","文件不存在.请确认后重新加载!!")else:try:with open(self.file\_path,mode \= "r") as fd:current\_list \= fd.readline() #一次读一行while current\_list: #表示直到current\_list中所有元素被读完,循环结束temp\_list = current\_list.split(",")     #按照逗号把每个list中的元素分割出来self.user\_list.append(temp\_list)    #把分割后的每个元素重新添加到user\_list列表中current\_list = fd.readline()    #因为我们一次只读一行。读完后如果不加这一句那么循环会一直只读第一行。except:showinfo("系统信息","文件读取出现异常.请联系管理员!!")def login(self):"""用户身份验证功能的实现1. 获取到文件中的用户名,密码,状态(是否被锁定)2. 判断用户是否被锁定及是否是规定用户以外的非法用户登录(如果是拒绝登录)3. 用户正确判断密码是否匹配,密码不匹配3次被锁定并写入到文件:return:"""# 获取输入的用户名及密码self.input\_user = self.var\_user.get()self.input\_password \= self.var\_password.get()#showinfo("提示信息","用户名:" + input\_user + "\\n" + "密码:" + input\_password)#实现身份验证for index in range(len(self.user\_list)): #这里的user\_list 为之前从文件中读取重新存入list列表中的数据#先判断用户名是否存在if self.input\_user.strip().lower() == str(self.user\_list\[index\]\[0\]).strip().lower():#如果用户名存在,再判断用户名是否被锁定。1为锁定,0为active.if "1" in str(self.user\_list\[index\]\[2\]):showinfo("系统提示", "该用户被锁定.请联系管理员解锁后再登录。")breakelse:#如果用户存在并且是active的状态再判断密码是否正确if self.input\_password != str(self.user\_list\[index\]\[1\]):self.misspasswd\_counter +=1 #初始值设置为0.如果上述条件不成立则循环加1次if self.misspasswd\_counter >=3: #设置密码错误次数最大不能超过3次showinfo("系统提示","密码输入错误3次账号被锁定!")#改变锁定账户的状态(如果错误3次则改变文件中账户的状态把第3个元素变为1代表用户被锁定)self.user\_list\[index\]\[2\] = "1\\n" #这里需要加一个空格#写入文件self.write\_file()  #调用下列write\_file()方法else:showinfo("系统提示", "密码错误,请重新输入")breakelse:self.misspasswd\_counter \= 0 #如果输入的password正确那么这里的错误次数还是为0self.current\_login\_list = self.user\_list\[index\]#用户密码输入都正确则加载主窗体()self.upload\_main()break#这句话的意思是:循环到最后如果没有找到相同的用户名则用户判定为不存在!!!(这句话为重点,也是因为这句话才循环时用索引)if index == len(self.user\_list)-1:showinfo("系统提示","输入的用户名不存在!")def write\_file(self):"""写入文件":1.分2次写入第一次先清空原文件,第2次再逐一写入2. 写入的是用户登录后反应的最新的状态信息:return:"""try:#\[1\] 先清空原文件(不放心可以先备份原文件再执行代码,不然数据会丢失)with open(self.file\_path,mode="w") as fd:fd.write("") #不写任何东西代表清空#\[2\] 再逐一把user\_list中的数据写入到文件."a"代表追加写入with open(self.file\_path,mode = "a") as fd:for item in self.user\_list:fd.write(",".join(item)) #通过.join()方法指定写入时按照什么进行分割写入文件。这里指定的是按照逗号分割写入except:showinfo("系统信息","写入数据失败.")def upload\_main(self):"""加载主窗体函数: 1. 用户验证通过后自动关闭当前窗体2. 用户验证通过后自动加载主窗体:return:"""#关闭当前窗体self.destroy()#加载主窗体self.main\_window = man.Main\_Windows(self.current\_login\_list,self.get\_login\_time())#man.Main\_Windows()中self.current\_login\_list及self.get\_login\_time()为加载登录主窗体后实现当前用户及登录时间显示的功能def get\_login\_time(self):"""实现用户登录后自动加载登录时间功能#通过import datetime这个模块中datetime.today()方法来实现.当然也可以通过其他方法实现比如时间元祖等:return:"""today \= datetime.today()return ("%04d/%02d/%02d %02d:%02d:%02d" % (today.year, today.month, today.day, today.hour, today.minute, today.second))if \_\_name\_\_ == "\_\_main\_\_":this\_login \= Login\_Windows()this\_login.mainloop()

用户登录界面

二,系统主界面

思路: 1. GUI界面的设计 --> 同上同样是通过tkinter进行设计
(1) 上部 : 加载主窗体的图片 * 右下方显示当前登录的用户及当时登录时的系统时间 (这里是这部分的重点)
(2) 左部: 左边部分是功能区域 (用户的增删改及修改用户及密码的GUI界面部署)
(3) 右部: 右边部分分2大区域 1. 查询区域( 学号,姓名,年龄,手机号码,住址 等 来查询的GUI界面部署)

  1. 数据展示区域(展示的是添加进来的student_info.txt中的数据,及查询后所展示的数据)

  2. 查询区域中查询按钮及显示全部数据的GUI部署
    (4) 总体 : 数据最终保存及退出界面的GUI界面部署

  3. 上部: 如何显示当前用户及当前登录的系统时间
    (1) logingui界面中的login方法里,用户最终登录系统成功的节点下 --> 获取登录成功的用户名及密码 (这里主要用到的是用户名) --> 存入到集合备用
    (2) logingui界面中,创建get_login_time()方法获取当前的系统时间
    (3) maingui主界面的构造函数中传参并实例化,把login界面中的集合在主界面下进行使用
    (4) 主界面上部右下方的label窗口中,加载当前的用户和时间

  4. 左部及右部 : 查看, 添加,修改 调用的都是同一个GUI界面. 如何实现在加载相同的窗口时,提示标题不相同
    (1) 通过flag来标识登录的detailgui是查看还是添加,修改 --> flag为全局变量 --> GUI窗体设计title部分不要写死 --> 通过获取title状态的方式识别
    (2) 创建load_window_flag方法来控制每种状态下窗口的显示

      1. flag =1 代表查看窗口  --> 查看窗口不允许更改任何信息,因此禁用detailgui查看窗口下的所有控件2. flag = 2 代表添加窗口  --> 因为是添加所以不做任何限制3. flag = 3 代表修改窗口   --> 学号绑定不许修改其他控件允许修改   -->可以更加优化修改窗口中每个控件的值的输入(因为时间原因我本人没有做更好的优化)
    

(3) 添加,修改,删除,修改密码等具体功能的实现 --> 详情见代码有注释

  1. 右部: TreeView控件中展示所有学员信息 -->通过查询功能的实现来展示 --> 详情见代码

代码实现:

python">from tkinter import \*
import tkinter.ttk as ttk
import os
from tkinter.messagebox import \*
import wangzhexiagu.GUI\_student\_system.detailgui as dt
import wangzhexiagu.GUI\_student\_system.change\_password as ps
class Main\_Windows(Tk):"""主窗体的构造函数1. current\_user,current\_time的引入是为了加载logingui.py窗体中用户输入及加载登录时间记录时间的参数2. 同样设计主窗体下界面的布局及配置"""def \_\_init\_\_(self,current\_login\_user,current\_time): #current\_login\_user为了实现登录信息的加载(记录logingui界面中当前用户是谁)#current\_time同样是为了记录当前用户登录的系统时间super().\_\_init\_\_()self.title("主窗体")self.geometry("1200x700+1+20")  # 通过控制图像大小可以通过+号来调整窗体出现的位置self.resizable(0, 0)  # 固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0self.iconbitmap(R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\photo\\china.ico")  # 加载.ico文件到窗口小图标. 网上可以将png转成ico文件# 添加图片背景色self\["bg"\] = "RoyalBlue"#设置全局变量self.login\_times = current\_time #为了记录用户的登录时间self.all\_list = \[\] # 读取student\_info.txt中所有的元素并存入all\_list中self.current\_stu\_list = \[\] #存储双击行匹配到的最终数据self.get\_number\_result = \[\] #用户存储获取到的所有学员信息self.file\_path = R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\loginUserInfo\_Data\\student\_info.txt"self.action\_flag \= 0  #设置查看/修改/添加学生信息的title值,默认为0self.current\_user\_list = current\_login\_user  #把login界面的list传到主界面接收#加载窗体self.Setup\_UI()#自动执行函数self.Load\_local\_Data()   # 自动加载数据(加载的是all\_list中已经读取到的所有数据)self.load\_TreeView(self.all\_list)   #自动将all\_list中每一行的数据加载到TreeView中展示#将窗体的行为转化为方法self.protocol("WM\_DELETE\_WINDOW",self.close\_windows)    #"WM\_DELETE\_WINDOW"为固定写法def Setup\_UI(self):"""布局主窗体的窗体并对其中的控件属性进行配置:return:"""#设置Sytle配置控件的属性self.Style01 = ttk.Style()self.Style01.configure("left.TPanedwindow",background="RoyalBlue")self.Style01.configure("right.TPanedwindow", background="skyblue")self.Style01.configure("TButton",font = ("微软雅黑",12,"bold"))self.Style01.configure("TLabel", font=("微软雅黑", 10, "bold"))self.Style01.configure("labframe.TButton", font=("微软雅黑", 10, "bold"))self.Style01.configure("title1.TLabel", font=("微软雅黑", 10, "bold"),background = "lightblue")# 加载窗体图片self.login\_img = PhotoImage(file=R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\photo\\1.png")self.label\_img \= ttk.Label(self, image=self.login\_img)self.label\_img.pack()#加载当前用户和时间self.label\_login\_user = ttk.Label(self,text = "当前登录用户:" + str(self.current\_user\_list\[0\]).title() +"\\n登录时间:" + self.login\_times,style = "title1.TLabel" )#str(self.current\_user\_list\[0\]).title()为用户登录后的首字母显示未大写self.label\_login\_user.place(x\=1000,y=165)# 左边按钮区域的布局self.pan\_left = ttk.PanedWindow(width =200,height=500,style ="left.TPanedwindow" )self.pan\_left.pack(side \= LEFT,padx=3,pady=1)# 添加左边区域按钮self.buttion\_useradd = ttk.Button(self.pan\_left,text = "添加学生",width =12,command = self.add\_student)self.buttion\_useradd.place(x \= 30,y = 20)self.buttion\_userupdate \= ttk.Button(self.pan\_left,text = "修改学生",width =12,command = self.update\_student)self.buttion\_userupdate.place(x \= 30,y = 60)self.buttion\_userdelete \= ttk.Button(self.pan\_left,text = "删除学生",width =12,command = self.delete\_student)self.buttion\_userdelete.place(x \= 30,y = 100)self.buttion\_changepassword \= ttk.Button(self.pan\_left,text = "更改密码",width =12,command = self.change\_password\_windows)self.buttion\_changepassword.place(x \= 30,y = 140)#右边按钮区域的布局self.pan\_right = ttk.PanedWindow(width = 991,height = 500,style = "right.TPanedwindow" )self.pan\_right.pack(side \= LEFT)# 添加查询区域(属于右边区域)self.labelFrame\_query = ttk.LabelFrame(self.pan\_right,text = "学生信息",width =990,height = 60)self.labelFrame\_query.place(x\=1,y=1)#添加控件self.label\_number = ttk.Label(self.labelFrame\_query,text = "学号:")self.label\_stu\_no \= StringVar()self.label\_number.place(x \=10,y =10)self.entry\_number \= ttk.Entry(self.labelFrame\_query,textvariable = self.label\_stu\_no,font = ("微软雅黑",10,"bold"),width=8)self.entry\_number.place(x \=50,y =10)self.label\_name \= ttk.Label(self.labelFrame\_query,text = "姓名:")self.get\_stu\_name \= StringVar()self.label\_stu\_name \= StringVar()self.label\_name.place(x \=130,y =10)self.entry\_name \= ttk.Entry(self.labelFrame\_query,textvariable = self.get\_stu\_name,font = ("微软雅黑",10,"bold"),width=10)self.entry\_name.place(x \=170,y =10)self.label\_age \= ttk.Label(self.labelFrame\_query,text = "年龄:")self.get\_stu\_age \= StringVar()self.label\_age.place(x \=270,y =10)self.entry\_age \= ttk.Entry(self.labelFrame\_query,textvariable=self.get\_stu\_age,font = ("微软雅黑",10,"bold"),width=5)self.entry\_age.place(x \=310,y =10)self.label\_mobile \= ttk.Label(self.labelFrame\_query,text = "电话:")self.get\_stu\_mobile \= StringVar()self.label\_mobile.place(x \=360,y =10)self.entry\_mobile \= ttk.Entry(self.labelFrame\_query,textvariable=self.get\_stu\_mobile,font = ("微软雅黑",10,"bold"),width=16)self.entry\_mobile.place(x \=400,y =10)self.label\_address \= ttk.Label(self.labelFrame\_query,text = "住址:")self.get\_stu\_address \= StringVar()self.label\_address.place(x \=540,y =10)self.entry\_address \= ttk.Entry(self.labelFrame\_query,textvariable=self.get\_stu\_address,font = ("微软雅黑",10,"bold"),width=20)self.entry\_address.place(x \=590,y =10)self.button\_search \= ttk.Button(self.labelFrame\_query,text = "查询",width=6,style="labframe.TButton",command = self.get\_student\_result)self.button\_search.place(x\=780, y=10)self.button\_homepage \= ttk.Button(self.labelFrame\_query,text = "返回主页面",width=10,style="labframe.TButton",command \= self.load\_all\_data)self.button\_homepage.place(x\=850, y=10)#添加TreeView控件self.treeView = ttk.Treeview(self.pan\_right,columns = ("学号","姓名","年龄","性别","电话","邮箱","家庭住址"),show \= "headings")# 设置每一列的宽度和对齐方式self.treeView.column("学号", width=80, anchor="center")self.treeView.column("姓名", width=60, anchor="w")  #w代表西面也就是左边对齐的意思self.treeView.column("年龄", width=60, anchor="center")self.treeView.column("性别", width=60, anchor="center")self.treeView.column("电话", width=180, anchor="center")self.treeView.column("邮箱", width=250, anchor="center")self.treeView.column("家庭住址", width=298, anchor="w")# 设置表头的标题文本self.treeView.heading("学号", text="学号")self.treeView.heading("姓名", text="姓名")self.treeView.heading("年龄", text="年龄")self.treeView.heading("性别", text="性别")self.treeView.heading("电话", text="电话")self.treeView.heading("邮箱", text="邮箱")self.treeView.heading("家庭住址", text="家庭住址")#插入滚动条#self.scrollBar = Scrollbar(self)#self.scrollBar.pack(side=RIGHT,fill=Y)#设置关联#self.scrollBar.config(command = self.treeView.yview)#展示treeView信息self.treeView.place(x=1,y=60,height =450)# 双击TreeView中某一行触发PopUp窗体self.treeView.bind("<Double-1>",self.view\_student)  #<Double>是必须的Double以后的可以任意但是不能跟命令行重名def Load\_local\_Data(self):"""加载student\_info.txt中的信息(本地文件的读取):return: 把文件中的每一个元素存储到 all\_list 中"""if not os.path.exists(self.file\_path):showinfo("系统提示","文件不存在.请确认后重新加载!!")else:try:with open(self.file\_path,mode \= "r") as fd:current\_list \= fd.readline() #一次读一行while current\_list:#表示直到current\_list中所有元素被读完,循环结束temp\_list = current\_list.split(",") #按照逗号把每个list中的元素分割出来self.all\_list.append(temp\_list) #把分割后的每个元素重新添加到all\_list列表中current\_list = fd.readline() #因为我们一次只读一行。读完后如果不加这一句那么循环会一直只读第一行。except:showinfo("系统信息","文件读取出现异常.请联系管理员!!")def load\_TreeView(self,student\_list:list):"""1. 判断all\_list中的长度是否为0如果为0则没有数据被加载2. 把数据加载到treeView中:return:"""#加载数据后清空TreeViewfor i in self.treeView.get\_children(): #固定用法self.treeView.delete(i)#加载数据if len(student\_list) == 0:  #这里的student\_list是个参数变量传什么数据就是什么。这里最终传的事all\_list中的数据在load\_TreeView(self.all\_list)中展示showinfo("系统消息","没有数据被加载!")else:for index in range(len(student\_list)):self.treeView.insert("",index,values = student\_list\[index\])def get\_student\_result(self):"""1. 获取输入的值2. 判断如果输入的值包含在all\_list中那么把数据存入到get\_number\_result列表中:return:返回的是匹配到的学生编号的所有信息"""#清空get\_number\_result中的数据(因为每次查询一个stu\_number就显示一条.如果不清空就会每次查询的结果都会被显示)self.get\_number\_result.clear()#获取输入的值get\_input = \[\]get\_input.append(self.label\_stu\_no.get().strip())get\_input.append(self.get\_stu\_name.get().strip())get\_input.append(self.get\_stu\_age.get().strip())get\_input.append(self.get\_stu\_mobile.get().strip())get\_input.append(self.get\_stu\_address.get().strip())#print(get\_input)#匹配学号把结果存入到get\_number\_result中(第一个元素学号必须填写)for item in self.all\_list:if get\_input\[0\] in item\[0\] and get\_input\[1\] in item\[1\] and get\_input\[2\] in item\[2\] \\and get\_input\[3\] in item\[4\] and get\_input\[4\] in item\[6\]:self.get\_number\_result.append(item)#print(self.get\_number\_result)#把数据加载到TreeView中self.load\_TreeView(self.get\_number\_result)def load\_all\_data(self):"""重新加载一下treeView中的所有数据就是展开全部信息:return:"""#清空所有填写的内容文本框self.label\_stu\_no.set("")self.get\_stu\_name.set("")self.get\_stu\_age.set("")self.get\_stu\_mobile.set("")self.get\_stu\_address.set("")#把all\_list中的数据加载到TreeViewself.load\_TreeView(self.all\_list)def load\_detail\_windows(self):"""创建load\_detail\_windows方法调用class detailgui模块中的方法(加载学生明细窗体):return:"""detail\_window \= dt.Detail\_Windows(self.action\_flag,self.current\_stu\_list,self.all\_list)#detailgui中传了几个参数就要load的几个参数self.wait\_window(detail\_window) #通过self.wait\_window()方法接收detail\_window的值return detail\_window.comp\_infodef add\_student(self):self.action\_flag \= 2  #如果action\_flag值等于2则title值为添加学生信息if self.load\_detail\_windows() == 1:self.load\_all\_data()else:returndef update\_student(self):self.action\_flag \= 3 #如果action\_flag值等于3则title值为修改学生信息#获取双击行的数据item = self.treeView.selection()\[0\]temp\_stu\_list \= self.treeView.item(item, "values")# 因为双击行中的数据并不是我们想要的所有数据,因此我们还要遍历all\_list中的元素。通过双击行获取的学号跟all\_list中的学号做对比# 如果两个学号相等那么把all\_list中对等的那一行的所有item存入到预备号的current\_stu\_list中for item in self.all\_list:if item\[0\] == temp\_stu\_list\[0\]:self.current\_stu\_list \= item#加载数据if self.load\_detail\_windows() == 1:self.load\_all\_data()else:returndef view\_student(self,event):"""1.获取选定行的数据2.遍历所有学员信息,当前学员学号等于所有学员信息中学号的信息那么就读取选定行所有数据3.重新加载数据:param event::return:"""self.action\_flag \= 1 #如果action\_flag值等于1则title值为查看学生信息# 固定方法获取双击行的数据item = self.treeView.selection()\[0\]temp\_stu\_list \= self.treeView.item(item, "values")# 因为双击行中的数据并不是我们想要的所有数据,因此我们还要遍历all\_list中的元素。通过双击行获取的学号跟all\_list中的学号做对比# 如果两个学号相等那么把all\_list中对等的那一行的所有item存入到预备号的current\_stu\_list中for item in self.all\_list:if item\[0\] == temp\_stu\_list\[0\]:self.current\_stu\_list \= itemself.load\_detail\_windows()def delete\_student(self):#获取选中行的数据item = self.treeView.selection()\[0\]temp\_stu\_list \= self.treeView.item(item, "values")#提醒是否删除数据choose \= askyesno("删除确认","确定要删除学生信息【学号:" + temp\_stu\_list\[0\] + "  姓名:" + temp\_stu\_list\[1\] + " \] 信息吗?")if choose:#如果是执行下面代码for index in range(len(self.all\_list)):if self.all\_list\[index\]\[0\] == temp\_stu\_list\[0\]:self.all\_list.pop(index)break#更新表格self.load\_all\_data()showinfo("系统消息","数据删除成功!")else:returndef close\_windows(self):"""1.提醒用户关闭窗口前是否保存数据2.保存数居前先清空数据再保存数据:return:"""choose \= askyesno("系统关闭提醒","是否将修改的数据保存到文件?")if choose: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\_list:temp \= ",".join(item)temp \= temp.replace("\\n","") + "\\n"  #为了让光标换行fd.write(temp)except:showinfo("系统消息","写入文件出错!")#提醒showinfo("系统消息","文件写入成功!")#关闭窗体self.destroy()else:self.destroy()def change\_password\_windows(self):this\_password\_windows \= ps.change\_User\_password(self.current\_user\_list)#把list绑定到change\_password\_windows中if \_\_name\_\_ == "\_\_main\_\_":this\_main\_window \= Main\_Windows()this\_main\_window.mainloop()

用户登录主界面

三,用户明细界面

思路:

  1. GUI界面的设计 --> 同上同样是通过tkinter进行设计

  2. 查看的情况下隐藏save保存按键

  3. 添加的情况下实现点击save保存按键存入数据到TreeView中展示 --> 先不写入到文件 --> 关闭主窗体时再写入文件

  4. 修改的情况下实现学号不允许修改其他允许修改

  5. 修改密码的情况下,绑定当前登录的用户,提示用户输入新旧密码等

代码实现:

python">from tkinter import \*
import tkinter.ttk as ttk
from tkinter.messagebox import \*class Detail\_Windows(Toplevel): # 这里要用Toplevel不能用Tk因为tkinter只支持一个主窗体存在.要想再跳出一个窗体必须选Topleveldef \_\_init\_\_(self,action\_flag:int,current\_stu:list,all\_stu\_list:list):super().\_\_init\_\_()self.title("学生信息窗体")self.geometry("700x600+300+100")  # 通过控制图像大小可以通过+号来调整窗体出现的位置self.resizable(0, 0)  # 固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0#self.iconbitmap(R"C:\\Users\\Administrator\\python\_图库\\china.ico")  # 加载.ico文件self\["bg"\] = "RoyalBlue"#设置全局变量self.flag = action\_flag  #接收构造函数中action\_flag中的值.(为了判断传进来的是添加,修改还是删除等状态值)self.current\_student\_list = current\_stu # 接收构造函数中current\_stu传进来的值(为了接收选中行中的值)self.all\_stu\_list = all\_stu\_list #接收构造函数中all\_stu\_list传进来的值(强调主窗体中all\_list中的值最终跟我们子窗体中all\_stu\_list中的值相同.因为传的是地址)# 加载窗体self.Setup\_UI()self.load\_windows\_flag()def Setup\_UI(self):# 通过style设置属性self.Style01 = ttk.Style()self.Style01.configure("titel2.TLabel", font=("微软眼黑", 24, "bold"), foreground="darkred")self.Style01.configure("TPanedwindow", background="lightcyan")#RoyalBlueself.Style01.configure("TButton", font=("微软眼黑", 11), background="RoyalBlue", foreground="black")self.Style01.configure("TLabel",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")self.Style01.configure("TRadiobutton",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")#加载窗体图片self.login\_img = PhotoImage(file = R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\photo\\beijingtu.png")self.label\_img \= ttk.Label(self,image = self.login\_img)self.label\_img.pack()#添加Titile框体self.var\_titel = StringVar()self.title\_label \= ttk.Label(self,textvariable=self.var\_titel,style = "titel2.TLabel")self.title\_label.place(x \= 20,y = 30)#添加一个Panewindowsself.pane = ttk.PanedWindow(self,width=696, height=450, style="TPanedwindow")self.pane.place(x\=2,y=98)#添加学员信息属性self.label\_number \= ttk.Label(self.pane,text = "学号",style="stu\_number.TLabel")self.var\_stunumber\=StringVar()self.label\_number.place(x\=30, y=20)self.entry\_number \= ttk.Entry(self.pane,textvariable = self.var\_stunumber,font=("微软眼黑",12, "bold"),width=8)self.entry\_number.place(x\=80, y=20)self.label\_name \= ttk.Label(self.pane,text = "姓名",style="TLabel")self.var\_stuname \= StringVar()self.label\_name.place(x\=170, y=20)self.entry\_name \= ttk.Entry(self.pane,textvariable=self.var\_stuname,font=("微软眼黑",12, "bold"),width=11)self.entry\_name.place(x\=220, y=20)self.label\_age \= ttk.Label(self.pane,text = "年龄",style="TLabel")self.var\_age \= StringVar()self.label\_age.place(x\=323, y=20)self.entry\_age \= ttk.Entry(self.pane,textvariable=self.var\_age,font=("微软眼黑",12, "bold"),width=5)self.entry\_age.place(x\=370, y=20)self.Label\_genter \= ttk.Label(self.pane, text="性别:")self.Label\_genter.place(x\=440, y=20)self.var\_genter \= IntVar()self.radio\_boy \= ttk.Radiobutton(self, text="男", variable=self.var\_genter, value= 0)self.radio\_boy.place(x\=520, y=116)self.radio\_gril \= ttk.Radiobutton(self, text="女", variable=self.var\_genter, value=1)self.radio\_gril.place(x\=600, y=116)self.label\_brithday \= ttk.Label(self.pane,text = "出生日期",style="TLabel")self.var\_brithday \= StringVar()self.label\_brithday.place(x\=30, y=70)self.entry\_brithday \= ttk.Entry(self.pane,textvariable=self.var\_brithday,font=("微软眼黑",12, "bold"),width=15)self.entry\_brithday.place(x\=120, y=70)self.label\_personid \= ttk.Label(self.pane,text = "身份证号码",style="TLabel")self.var\_personid \= StringVar()self.label\_personid.place(x\=320, y=70)self.entry\_personid \= ttk.Entry(self.pane,textvariable=self.var\_personid,font=("微软眼黑",12, "bold"),width=24)self.entry\_personid.place(x\=430, y=70)self.label\_mobile \= ttk.Label(self.pane,text = "手机号码",style="TLabel")self.var\_mobile \= StringVar()self.label\_mobile.place(x\=30, y=120)self.entry\_mobile \= ttk.Entry(self.pane,textvariable=self.var\_mobile,font=("微软眼黑",12, "bold"),width=18)self.entry\_mobile.place(x\=120, y=120)self.label\_mail \= ttk.Label(self.pane,text = "邮箱地址",style="TLabel")self.var\_mail \= StringVar()self.label\_mail.place(x\=320, y=120)self.entry\_mail \= ttk.Entry(self.pane,textvariable=self.var\_mail,font=("微软眼黑",12, "bold"),width=24)self.entry\_mail.place(x\=430, y=120)self.label\_homeaddress \= ttk.Label(self.pane,text = "家庭住址",style="TLabel")self.var\_homeaddress \= StringVar()self.label\_homeaddress.place(x\=30, y=170)self.entry\_homeaddress \= ttk.Entry(self.pane,textvariable=self.var\_homeaddress,font=("微软眼黑",12, "bold"),width=59)self.entry\_homeaddress.place(x\=120, y=170)self.label\_admission\_time \= ttk.Label(self.pane,text = "入学时间",style="TLabel")self.var\_admission\_time \= StringVar()self.label\_admission\_time.place(x\=30, y=220)self.entry\_admission\_time \= ttk.Entry(self.pane,textvariable=self.var\_admission\_time,font=("微软眼黑",12, "bold"),width=18)self.entry\_admission\_time.place(x\=120, y=220)self.label\_professional \= ttk.Label(self.pane,text = "职业",style="TLabel")self.var\_professional \=StringVar()self.label\_professional.place(x\=320, y=220)self.entry\_professional \= ttk.Entry(self.pane,textvariable=self.var\_professional,font=("微软眼黑",12, "bold"),width=15)self.entry\_professional.place(x\=380, y=220)self.label\_emergency\_contact \= ttk.Label(self.pane,text = "紧急联系人",style="TLabel")self.var\_emergency\_contact \= StringVar()self.label\_emergency\_contact.place(x\=30, y=270)self.entry\_emergency\_contact \= ttk.Entry(self.pane,textvariable=self.var\_emergency\_contact,font=("微软眼黑",12, "bold"),width=15)self.entry\_emergency\_contact.place(x\=150, y=270)self.label\_emergency\_mobile \= ttk.Label(self.pane,text = "紧急联系人电话",style="TLabel")self.var\_emergency\_mobile \= StringVar()self.label\_emergency\_mobile.place(x\=320, y=270)self.entry\_emergency\_mobile \= ttk.Entry(self.pane,textvariable=self.var\_emergency\_mobile,font=("微软眼黑",12, "bold"),width=20)self.entry\_emergency\_mobile.place(x\=470, y=270)#添加保存,关闭按钮self.save\_buttion = ttk.Button(self, text="保存", width=10,command = self.submit)self.save\_buttion.place(x\=480, y=560)self.exit\_buttion \= ttk.Button(self, text="退出", width=10,command = self.close\_windows)self.exit\_buttion.place(x\=580, y=560)def load\_windows\_flag(self):"""设置加载学员信息的titel值(通过调用Setup\_UI(self)中textvariable=self.var\_titel变量的方式):return:"""if self.flag == 1:self.var\_titel.set("\== 查看学生信息 ==")self.load\_stu\_detail()#控制学员信息的状态self.save\_buttion.place\_forget() # 隐藏save\_buttion按键的固定写法#通过控制entry变量中的\["state"\] = Disabled来禁用对象中的entry值.从而达到只读的效果self.entry\_number\["state"\] = DISABLEDself.entry\_name\["state"\] = DISABLEDself.entry\_age\["state"\] = DISABLEDself.radio\_boy\["state"\] = DISABLEDself.radio\_gril\["state"\] = DISABLEDself.entry\_brithday\["state"\] = DISABLEDself.entry\_homeaddress\["state"\] = DISABLEDself.entry\_admission\_time\["state"\] = DISABLEDself.entry\_mail\["state"\] = DISABLEDself.entry\_mobile\["state"\] = DISABLEDself.entry\_personid\["state"\] = DISABLEDself.entry\_professional\["state"\] = DISABLEDself.entry\_emergency\_contact\["state"\] = DISABLEDself.entry\_emergency\_mobile\["state"\] = DISABLEDelif self.flag == 2:self.var\_titel.set("\== 添加学生信息 ==")elif self.flag == 3:self.var\_titel.set("\== 修改学生信息 ==")#先填充数据self.load\_stu\_detail()#控制学号不允许修改self.entry\_number\["state"\] = DISABLEDdef load\_stu\_detail(self):"""因为展示跟修改都需要调用后台数据.因此通过load\_stu\_detail方法进行调用1.判断传入进来的值是否为0,如果是说明没有数据被加载2.有数据的情况通过变量.set()方法来匹配每个元素对应本地数据的下标性别:因为性别分男女分别设定了0跟1.因此这里要判断一下。一定要跟设定男女values的值对应上设定:return:"""if len(self.current\_student\_list) == 0:showinfo("系统提示","没有数据需要展示!")else:self.var\_stunumber.set(self.current\_student\_list\[0\])  #学号self.var\_stuname.set(self.current\_student\_list\[1\]) #姓名self.var\_age.set(self.current\_student\_list\[2\]) #年龄if "男" in self.current\_student\_list\[3\]:self.var\_genter.set(0)else:self.var\_genter.set(1)self.var\_brithday.set(self.current\_student\_list\[7\])self.var\_mobile.set(self.current\_student\_list\[4\])self.var\_mail.set(self.current\_student\_list\[5\])self.var\_homeaddress.set(self.current\_student\_list\[6\])self.var\_personid.set(self.current\_student\_list\[8\])self.var\_admission\_time.set(self.current\_student\_list\[9\])self.var\_professional.set(self.current\_student\_list\[10\])self.var\_emergency\_contact.set(self.current\_student\_list\[11\])self.var\_emergency\_mobile.set(self.current\_student\_list\[12\])def close\_windows(self):"""关闭窗口:return:"""self.comp\_info \= 0self.destroy()def submit(self):if self.flag == 1:   #view datapasselif self.flag == 2: #add data#准备追加学生的数据temp\_list = \[\]if len(str(self.entry\_number.get()).strip()) == 0:showinfo("系统消息","学号不能为空!")else:temp\_list.append(str(self.entry\_number.get()).strip())temp\_list.append(str(self.entry\_name.get()).strip())temp\_list.append(str(self.entry\_age.get()).strip())if self.var\_genter.get() == 0:temp\_list.append("男")else:temp\_list.append("女")temp\_list.append(str(self.entry\_mobile.get()).strip())temp\_list.append(str(self.entry\_mail.get()).strip())temp\_list.append(str(self.entry\_homeaddress.get()).strip())temp\_list.append(str(self.entry\_brithday.get()).strip())temp\_list.append(str(self.entry\_personid.get()).strip())temp\_list.append(str(self.entry\_admission\_time.get()).strip())temp\_list.append(str(self.entry\_professional.get()).strip())temp\_list.append(str(self.entry\_emergency\_contact.get()).strip())temp\_list.append(str(self.entry\_emergency\_mobile.get()).strip())#追加数据self.all\_stu\_list.append(temp\_list)#提醒showinfo("系统信息","学生信息添加成功!")#反馈信号给主窗体self.comp\_info = 1self.destroy()elif self.flag == 3: #update datatemp\_list = \[\]if len(str(self.entry\_number.get()).strip()) == 0:showinfo("系统消息", "学号不能为空!")returnelse:temp\_list.append(str(self.entry\_number.get()).strip())temp\_list.append(str(self.entry\_name.get()).strip())temp\_list.append(str(self.entry\_age.get()).strip())if self.var\_genter.get() == 0:temp\_list.append("男")else:temp\_list.append("女")temp\_list.append(str(self.entry\_mobile.get()).strip())temp\_list.append(str(self.entry\_mail.get()).strip())temp\_list.append(str(self.entry\_homeaddress.get()).strip())temp\_list.append(str(self.entry\_brithday.get()).strip())temp\_list.append(str(self.entry\_personid.get()).strip())temp\_list.append(str(self.entry\_admission\_time.get()).strip())temp\_list.append(str(self.entry\_professional.get()).strip())temp\_list.append(str(self.entry\_emergency\_contact.get()).strip())temp\_list.append(str(self.entry\_emergency\_mobile.get()).strip())#遍历集合for index in range(len(self.all\_stu\_list)):if self.all\_stu\_list\[index\]\[0\] == self.current\_student\_list\[0\]:self.all\_stu\_list\[index\] \= temp\_list# 提醒showinfo("系统信息", "学生信息修改成功!")# 反馈信号给主窗体self.comp\_info = 1# 关闭窗口self.destroy()if \_\_name\_\_ == "\_\_main\_\_":this\_windows \= Detail\_Windows()this\_windows.mainloop()

学生明细界面

三,用户修改密码界面

#难点并不多因此直接上代码

代码实现:

python">from tkinter import \*
import tkinter.ttk as ttk
from tkinter.messagebox import \*
import osclass change\_User\_password(Toplevel): # 这里要用Toplevel不能用Tk因为tkinter只支持一个主窗体存在.要想再跳出一个窗体必须选Topleveldef \_\_init\_\_(self,current\_user\_list):super().\_\_init\_\_()self.title("修改密码")self.geometry("600x500+300+100")  # 通过控制图像大小可以通过+号来调整窗体出现的位置self.resizable(0, 0)  # 固定窗体大小.不允许改动窗体大小. resizable(0,0)表示x轴为0y轴也为0#self.iconbitmap(R"C:\\Users\\Administrator\\python\_图库\\china.ico")  # 加载.ico文件self\["bg"\] = "RoyalBlue"#定义全局变量self.current\_user\_list = current\_user\_list  #同样在change\_User\_password窗口中接收list的地址self.file\_path = R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\loginUserInfo\_Data\\loginuser\_info.txt"self.get\_all\_userlist \= \[\]  #获取所有的账号密码#加载setup\_UIself.Setup\_UI()#初始化self.var\_loginuser.set(self.current\_user\_list\[0\]) #初始化登录的账号#自动加载self.get\_all\_loginuser()def Setup\_UI(self):# 通过style设置属性self.Style01 = ttk.Style()self.Style01.configure("titel3.TLabel", font=("微软眼黑", 20, "bold"), foreground="darkred")self.Style01.configure("TPanedwindow", background="lightcyan")#RoyalBlueself.Style01.configure("TButton", font=("微软眼黑", 11), background="RoyalBlue", foreground="black")self.Style01.configure("TLabel",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")self.Style01.configure("TRadiobutton",font=("微软眼黑", 14, "bold"), foreground="black",background="lightcyan")#加载窗体图片self.login\_img = PhotoImage(file = R"C:\\Users\\Administrator\\PycharmProjects\\untitled1\\wangzhexiagu\\GUI\_student\_system\\photo\\beijingtu.png")self.label\_img \= ttk.Label(self,image = self.login\_img)self.label\_img.pack()#添加Titile框体self.title\_label = ttk.Label(self,text="\== 更改密码 ==",style = "titel3.TLabel")self.title\_label.place(x \= 20,y = 30)#添加一个Panewindowsself.pane = ttk.PanedWindow(self,width=596, height=360, style="TPanedwindow")self.pane.place(x\=2,y=98)self.label\_login\_user \= ttk.Label(self.pane,text = "登录账号",style="stu\_number.TLabel")self.var\_loginuser\=StringVar()self.label\_login\_user.place(x\=170, y=60)self.entry\_login\_user \= ttk.Entry(self.pane,state = DISABLED,textvariable = self.var\_loginuser,font=("微软眼黑",14, "bold"),width=16)self.entry\_login\_user.place(x\=270, y=60)self.label\_old\_password \= ttk.Label(self.pane,text = "旧密码",style="stu\_number.TLabel")self.var\_old\_password\=StringVar()self.label\_old\_password.place(x\=170, y=120)self.entry\_old\_password \= ttk.Entry(self.pane,show = "\*",textvariable = self.var\_old\_password,font=("微软眼黑",14, "bold"),width=16)self.entry\_old\_password.place(x\=270, y=120)self.label\_new\_password \= ttk.Label(self.pane,text = "新密码",style="stu\_number.TLabel")self.var\_new\_password\=StringVar()self.label\_new\_password.place(x\=170, y=180)self.entry\_new\_password \= ttk.Entry(self.pane,show = "\*",textvariable = self.var\_new\_password,font=("微软眼黑",14, "bold"),width=16)self.entry\_new\_password.place(x\=270, y=180)self.label\_reinput\_password \= ttk.Label(self.pane,text = "重新输入新密码",style="stu\_number.TLabel")self.var\_reinput\_password\=StringVar()self.label\_reinput\_password.place(x\=120, y=240)self.entry\_reinput\_password \= ttk.Entry(self.pane,show = "\*",textvariable = self.var\_reinput\_password,font=("微软眼黑",14, "bold"),width=16)self.entry\_reinput\_password.place(x\=270, y=240)#添加保存,关闭按钮self.save\_buttion = ttk.Button(self, text="保存", width=10,command = self.save\_pass\_windows)self.save\_buttion.place(x\=380, y=470)self.exit\_buttion \= ttk.Button(self, text="退出", width=10,command = self.close\_pass\_windows)self.exit\_buttion.place(x\=480, y=470)def close\_pass\_windows(self):self.destroy()def save\_pass\_windows(self):# 获取登录账号相关的值old\_password = self.var\_old\_password.get()new\_password \= self.var\_new\_password.get()second\_password \= self.var\_reinput\_password.get()#判断旧密码是否真确if old\_password != self.current\_user\_list\[1\]:showinfo("系统消息","输入的旧密码不正确!")return#判断新密码跟旧密码是否相同if new\_password == old\_password:showinfo("系统消息", "新密码不能跟旧密码相同!")return#判断输入的新密码不能为空if len(new\_password.strip()) == 0:showinfo("系统消息", "新密码不能为空!")return#两次密码输入是否相同if new\_password != second\_password:showinfo("系统消息", "两次密码输入不一致!")return#修改密码for index in range(len(self.get\_all\_userlist)):if self.get\_all\_userlist\[index\]\[0\] == self.current\_user\_list\[0\]:self.get\_all\_userlist\[index\]\[1\] = new\_password# 完成更改(写入文件)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.get\_all\_userlist:temp \= ",".join(item)temp \= temp.replace("\\n","") + "\\n"fd.write(temp)except:showinfo("系统消息","写入文件出错.请联系管理员")#提示showinfo("系统消息", "密码修改成功!")#关闭窗口self.destroy()def get\_all\_loginuser(self):"""读取文件获取所有的账号信息保存到get\_all:return:"""if not os.path.exists(self.file\_path):showinfo("系统提示","文件不存在.请确认后重新加载!!")else:try:with open(self.file\_path,mode \= "r") as fd:current\_list \= fd.readline() #一次读一行while current\_list:#表示直到current\_list中所有元素被读完,循环结束temp\_list = current\_list.split(",") #按照逗号把每个list中的元素分割出来self.get\_all\_userlist.append(temp\_list) #把分割后的每个元素重新添加到all\_list列表中current\_list = fd.readline() #因为我们一次只读一行。读完后如果不加这一句那么循环会一直只读第一行。except:showinfo("系统信息","文件读取出现异常.请联系管理员!!")if \_\_name\_\_ == "\_\_main\_\_":this\_windows \= change\_User\_password()this\_windows.mainloop()

用户修改密码界面

关于Python技能储备!

如果你是准备学习Python或者正在学习(想通过Python兼职),下面这些你应该能用得上:
【点击这里】领取!
包括:激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
Python所有方向的学习路线图,清楚各个方向要学什么东西
100多节Python课程视频,涵盖必备基础、爬虫和数据分析
100多个Python实战案例学习不再是只会理论
华为出品独家Python漫画教程,手机也能学习
历年互联网企业Python面试真题,复习时非常方便
****

在这里插入图片描述

在这里插入图片描述

以上就是本次分享的全部内容。我们下期见~


http://www.ppmy.cn/embedded/105059.html

相关文章

用ChatGPT提升论文质量:改进语法、用词和行文的有效方法

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术写作中&#xff0c;语法、用词和行文的质量直接影响论文的可读性和学术价值。今天我们将介绍如何利用ChatGPT优化论文的语法结构、改进用词精准度以及提升行文流畅性。帮助写作者…

贪心算法---单调递增的数字

题目&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 思路&#xff1a; 对于非递增的相邻位两个数字x和y&#x…

直播路由器的原理是什么

随着网络直播行业的蓬勃发展&#xff0c;直播路由器作为确保直播稳定性和高质量传输的关键设备&#xff0c;其重要性日益凸显。本文将深入探讨直播路由器的原理&#xff0c;解析其如何确保直播过程中的数据传输高效、稳定&#xff0c;以满足高并发、低延迟的需求。 一、直播路由…

书生大模型实战营(2)——函数实现+Vscode连接InternStudio debug笔记

第二关任务&#xff1a; 任务一&#xff1a;请实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 任务二&#xff1a;请使用本地vscode连接远程开发机&#xff0c;将上面你写…

CSS学习9

盒子模型2 一、content宽度和高度二、盒子模型的布具稳定性三、CSS3盒模型四、盒子阴影 一、content宽度和高度 使用宽度属性和高度属性可以对盒子的大小进行控制。 width和height的属性值可以为不同单位的数值或相对于父元素的百分比%&#xff0c;实际工作中最常用的是像素值…

神经网络中激活函数介绍、优缺点分析

本文主要介绍神经网络中的常用的激活函数 激活函数是神经网络中用于引入非线性模型&#xff0c;提升模型泛化能力的函数 非线性激活函数至关重要&#xff0c;它可以让神经网络学习复杂特征、提供模型复杂度 1、激活函数定义 激活函数是神经网络模型中的一种非线性函数&#xf…

Python编码系列—Python项目架构的艺术:最佳实践与实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

2.5 8086-8088CPU引脚

&#x1f393; 微机原理考点专栏&#xff08;通篇免费&#xff09; 欢迎来到我的微机原理专栏&#xff01;我将帮助你在最短时间内掌握微机原理的核心内容&#xff0c;为你的考研或期末考试保驾护航。 为什么选择我的视频&#xff1f; 全程考点讲解&#xff1a;每一节视频都…