【Python】学生信息管理系统_开发(GUI界面)

学生信息管理系统的开发

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

             2. 系统主界面     -->    maingui.py

             3. 学生明细界面  -->   detailgui.py 

             4. 修改登录账号密码界面 -->  changepassword.py

             5. GUI界面需要的图库

             6. 数据   -->   (1) 登录账号相关文件 (loginuser_info.txt)        (2) 加载到主界面中显示的学生信息文件(student_info.txt)

#  图片部分

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

扫描二维码关注公众号,回复: 10650403 查看本文章

#  文件部分

student_info.txt

95001,橘右京,20,男,15977693796,[email protected],日本大阪府大阪市,1988/9/12,110103199110186521,2010年6月18日,战士,橘子成精,18911213348
95002,韩信,19,男,18695719656,www.hanxin163.com,陕西省西安市韩台镇韩家村196号,1990/5/30,610103199110182714,2010年2月18日,刺客,韩悠悠,15977693321
95003,亚瑟,30,男,15834769921,[email protected],美国卡里福尼亚州,1981/7/21,370626798909071691,1978年7月17日,战士,亚历山大三世,18955789581
95004,王昭君,18,女,18977623571,[email protected],江苏省苏州市姑苏区,1998/12/3,320506198911112836,2014年9月30日,法师,王他爹,17966289971
95005,阿珂,17,女,13644893365,[email protected],山东省烟台市芝罘区,2000/3/23,370602198909071333,1999年9月9日,刺客,阿可可,15855372291
95006,白起,28,男,15962789930,[email protected],陕西省西安市,1978/12/31,610103199110182255,1978年12月30日,战士,白斩,18633462237
95007,苏烈,37,男,18912347689,[email protected],辽宁省黑龙江市,1975/9/30,3205061989167810056,1971年8月12日,战士,苏醒,15977889900
95008,虞姬,18,女,15942887540,[email protected],江苏省苏州市,1999/6/10,320506198911110056,1998年2月28日,射手,虞阵子,15890017789
95009,鲁班,16,男,18856713396,[email protected],河南省郑州市,2001/5/7,3865198911110011,2001年12月12日,射手,鲁班大师,15977889911
95010,狄仁杰,20,男,18867321541,[email protected],江苏省杭州市,1996/10/30,32050619891230056,1998年2月1日,射手,狄小兵,15778890071
95011,东方曜,21,男,15855667913,[email protected],陕西省西安市,1997/10/24,610103199110181412,2008年11月06日,战士,东方朔,18977239971
95012,嬴政,29,男,15588988888,[email protected],陕西省西安市,1981/4/12,610103199110182079,1999年5月31日,法师,嬴政他爹,18857613374
95013,蔡文姬,20,女,18666890013,[email protected],云南省大理市,1997/10/16,320506156911110056,1998年11月27日,辅助,蔡铭,18758092231
95014,甄姬,24,女,18562782278,[email protected],山西省大同市,1994/12/1,320506198911110056,1997年4月30日,法师,甄子丹,16599002345
95015,宫本武藏,27,男,18977889900,[email protected],日本大阪府大阪市,1982/3/19,3205061989112346,1982年2月21日,战士,宫本重生,17971889920
95016,明世隐,30,男,18662722447,[email protected],湖南省荆州市,1977/11/11,320506198911110216,1971年2月28日,辅助,明世隐公子,15888990011
95017,李元芳,17,男,15727458228,[email protected],湖北省武汉市,1999/12/11,32050619891111112234,2004年7月8日,射手,李元直,1857789012237
95018,盾山,37,男,18677882288,[email protected],山东省烟台市,1975/12/12,370602198909071472,1978年5月17日,辅助,盾地,15888887777
95019,诸葛亮,24,男,18911118888,[email protected],湖南省荆州市,1996/6/8,320506198911223344,1998年9月11日,法师,诸葛苏,15777812910
95020,赵云,27,男,18889966657,[email protected],河南省荆州市,1993/12/12,320506198922331005,1989年10月28日,战士,赵形,167877889109
95021,关羽,29,男,18811007788,[email protected],山东省烟台市,1981/12/14,370602198909070437,1990年1月12日,战士,关包,13877639961
95022,不知火舞,18,女,18677120091,[email protected],日本东京,1997/2/14,370602199702141471,2020年4月1日,法师,安迪,18612416097
95023,张飞,28,男,15811221190,[email protected],河南省郑州市,1985/1/30,320506198501301014,2020年1月1日,坦克,刘备,15988002581

loginuser_info.txt 

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次判定为锁定并写入到文件

代码实现:

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 man

class 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轴也为0
        self.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("系统提示", "该用户被锁定.请联系管理员解锁后再登录。")
                    break
                else:
                    #如果用户存在并且是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("系统提示", "密码错误,请重新输入")

                        break

                    else:
                        self.misspasswd_counter = 0 #如果输入的password正确那么这里的错误次数还是为0
                        self.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界面部署)  

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

                                                                            3. 查询区域中查询按钮及显示全部数据的GUI部署

                 (4)  总体 : 数据最终保存及退出界面的GUI界面部署

            2.   上部:  如何显示当前用户及当前登录的系统时间

                         (1)  logingui界面中的login方法里,用户最终登录系统成功的节点下  --> 获取登录成功的用户名及密码 (这里主要用到的是用户名)  --> 存入到集合备用

                         (2)  logingui界面中,创建get_login_time()方法获取当前的系统时间

                         (3)  maingui主界面的构造函数中传参并实例化,把login界面中的集合在主界面下进行使用

                         (4)  主界面上部右下方的label窗口中,加载当前的用户和时间

             3. 左部及右部 :  查看, 添加,修改 调用的都是同一个GUI界面. 如何实现在加载相同的窗口时,提示标题不相同

                         (1)  通过flag来标识登录的detailgui是查看还是添加,修改    -->  flag为全局变量   --> GUI窗体设计title部分不要写死 --> 通过获取title状态的方式识别

                         (2)  创建load_window_flag方法来控制每种状态下窗口的显示

                                1. flag =1 代表查看窗口  --> 查看窗口不允许更改任何信息,因此禁用detailgui查看窗口下的所有控件

                                2. flag = 2 代表添加窗口  --> 因为是添加所以不做任何限制

                                3. flag = 3 代表修改窗口   --> 学号绑定不许修改其他控件允许修改   -->可以更加优化修改窗口中每个控件的值的输入(因为时间原因我本人没有做更好的优化)

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

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

代码实现:

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轴也为0
        self.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值,默认为0
        self.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:
        """
        #加载数据后清空TreeView
        for 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中的数据加载到TreeView
        self.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_info

    def add_student(self):
        self.action_flag = 2  #如果action_flag值等于2则title值为添加学生信息
        if self.load_detail_windows() == 1:
            self.load_all_data()
        else:
            return

    def 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:
            return

    def 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 = item
        self.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:
            return

    def 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. 修改密码的情况下,绑定当前登录的用户,提示用户输入新旧密码等

代码实现:

from tkinter import *
import tkinter.ttk as ttk
from tkinter.messagebox import *

class Detail_Windows(Toplevel): # 这里要用Toplevel不能用Tk因为tkinter只支持一个主窗体存在.要想再跳出一个窗体必须选Toplevel
    def __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")#RoyalBlue
        self.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)

        #添加一个Panewindows
        self.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"] = DISABLED
            self.entry_name["state"] = DISABLED
            self.entry_age["state"] = DISABLED
            self.radio_boy["state"] = DISABLED
            self.radio_gril["state"] = DISABLED
            self.entry_brithday["state"] = DISABLED
            self.entry_homeaddress["state"] = DISABLED
            self.entry_admission_time["state"] = DISABLED
            self.entry_mail["state"] = DISABLED
            self.entry_mobile["state"] = DISABLED
            self.entry_personid["state"] = DISABLED
            self.entry_professional["state"] = DISABLED
            self.entry_emergency_contact["state"] = DISABLED
            self.entry_emergency_mobile["state"] = DISABLED

        elif self.flag == 2:
            self.var_titel.set("== 添加学生信息 ==")
        elif self.flag == 3:
            self.var_titel.set("== 修改学生信息 ==")
            #先填充数据
            self.load_stu_detail()
            #控制学号不允许修改
            self.entry_number["state"] = DISABLED

    def 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 = 0
        self.destroy()

    def submit(self):
        if self.flag == 1:   #view data
           pass
        elif 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 = 1
                self.destroy()
        elif self.flag == 3: #update data
            temp_list = []
            if len(str(self.entry_number.get()).strip()) == 0:
                showinfo("系统消息", "学号不能为空!")
                return
            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())

            #遍历集合
            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()
学生明细界面

三,用户修改密码界面

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

代码实现:

from tkinter import *
import tkinter.ttk as ttk
from tkinter.messagebox import *
import os

class change_User_password(Toplevel): # 这里要用Toplevel不能用Tk因为tkinter只支持一个主窗体存在.要想再跳出一个窗体必须选Toplevel
    def __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_UI
        self.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")#RoyalBlue
        self.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)

        #添加一个Panewindows
        self.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()
用户修改密码界面

猜你喜欢

转载自www.cnblogs.com/liupengpengg/p/12671663.html