史上最全面的python学生管理系统教程(三)

目录

序言

注册与登录

了解python tkinter库的使用

登录界面布局

构思

图片来源

细节处理

注册窗口

构思

细节处理

注册与登录整体代码

查看个人成绩

主要流程

函数代码

获得当前登录帐号

思路

部分代码

修改个人密码

页面布局

流程

整体代码

导出个人成绩单

流程

具体代码

CSDN所上传的文件资源里有小问题的bug

更改后代码 

学生页面的查看个人成绩单功能模块:

教师页面的两个功能模块:

结语

史上最全面的python学生管理系统教程(一)

史上最全面的python学生管理系统教程(二)


序言

    这篇将开始软件中学生页面的开发过程,将分为以下几个板块:注册与登录,查看个人成绩,获得当前登录帐号,修改个人密码,导出个人成绩单。

注册与登录

了解python tkinter库的使用

    这里有很详细的教程,很重要,如果不懂使用就看不懂代码

登录界面布局

构思

  • 一张图展示学校的logo或者该软件系统名字
  • 学号输入框和密码输入框
  • 登录按钮,分角色
  • 注册按钮

图片来源

    我是根据网上免费文字签名设计加上图片去底实现学校logo的,具体网址:文字签名设计图片去底

细节处理

  • 学生与教师登录按钮合而为一判断标志

    具体实现方法为:获取输入框的帐号密码,将帐号与密码与数据库对比,如果是学生将会有返回值,同理教师也一样,用if去判断具体是学生还是教师登录。

            Student_number=self.student_number.get()
            #print(User_id)
            Student_pw=self.student_pw.get()
            #print(User_pw)
            #获取输入框帐号密码
            pd_student=user_slect_number_pw(Student_number,Student_pw)
            pd_teacher=teacher_slect_number_pw(Student_number,Student_pw)
            #两个判断标志
            if pd_student:
                numbers=Student_number
                self.page.destroy()
                #当前窗口销毁
                self.lab3.pack_forget()
                #学校logo图片去除
                StudentPage(self.root)
            elif pd_teacher:
                numbers=Student_number
                self.page.destroy()
                self.lab3.pack_forget()
                TeacherPage(self.root)
  • 输入三次密码错误终止登录判断

    定义一个全局变量 i ,初值为0,每输入密码错误一次 i + 1,当 i 为 3 时当前登录窗口销毁。其实这里可以再定义一个功能,也就是忘记密码并进行更改密码操作,但是当时并未想到,所以也就略过,有兴趣的同学可以实现一下。

            elif i>2:
                showinfo(title='错误', message='密码三次输入错误,此次登录被终止!')
                self.root.destroy()
            else:
                i+=1
                showinfo(title='错误', message='账号或密码错误!')

注册窗口

构思

    与数据库设计一致,分别为姓名,年龄,学号还有密码。也就是说四个输入框,一个注册按钮。

细节处理

    由于功能需求上有说明学号必须为12位,所以注册之前先进行学号判断,并进行去重处理,先判断该学号是否存在于学生信息表或者教师信息表中。

                age = self.new_age.get()
                number = self.new_number.get()
                name = self.new_name.get()
                pw = self.new_pw.get()
                if len(number) < 12:
                    showinfo(title='提示', message='学号为12位的数字,请重新输入!')
                else:
                    XWC=user_showdb(number)#先判断账号是否存在于学生或者教师数据库
                    SHB=teacher_showdb(number)
                    if XWC == None and SHB == None:
                        user_insertData(number,name,pw,age)
                        showinfo(title='提示', message='注册成功')
                        self.window_sign_up.destroy()
                    else:
                        self.window_sign_up.destroy()
                        showinfo(title='提示',message='学号重复,注册失败,请修改学号!')  

注册与登录整体代码

class LoginPage(object):
    def __init__(self, master=None):
        self.root = master
        winWidth = 650
        winHeight = 400
        screenWidth = self.root.winfo_screenwidth()
        screenHeight = self.root.winfo_screenheight()

        x = int((screenWidth - winWidth) / 2)
        y = int((screenHeight - winHeight) / 2)
        # 设置窗口初始位置在屏幕居中
        self.root.geometry("%sx%s+%s+%s" % (winWidth, winHeight, x, y))
        # 设置窗口图标
        # root.iconbitmap("./image/icon.ico")
        # 设置窗口宽高固定
        self.root.resizable(0, 0)
        self.student_number = StringVar()
        self.student_pw = StringVar() 
        self.createPage()
    
    def createPage(self):
        '''
        登录页面
        1:创建图片组件
        2:根目录基础上添加Frame容器
        3:Frame容器上添加注册控件
        '''
        bm=PhotoImage(file=r'cxk.gif')#图片素材位置
        self.lab3=Label(self.root,image=bm)
        self.lab3.bm=bm
        self.lab3.pack()
        
        self.page = Frame(self.root) 
        self.page.pack()
        Label(self.page).grid(row=0, stick=W) 
        Label(self.page, text = '学号: ').grid(row=1, stick=W, pady=10) 
        Entry(self.page, textvariable=self.student_number).grid(row=1, column=1, stick=E) 
        Label(self.page, text = '密码: ').grid(row=2, stick=W, pady=10) 
        Entry(self.page, textvariable=self.student_pw, show='*').grid(row=2, column=1, stick=E) 
        Button(self.page, text='管理员登录', command=self.admin_loginCheck).grid(row=3, column=0)
        #self.root.bind('<KeyPress-Return>',self.admin_loginCheck1)#绑定键盘上的回车登录
        Button(self.page, text='学生注册',command=self.signup).grid(row=3, column=3) 
        Button(self.page, text='学生/教师登录', command=self.student_loginCheck).grid(row=3,column=1) 
        #self.root.bind('<KeyPress-Return>',self.user_loginCheck1)#绑定键盘上的回车登录
        
    def admin_loginCheck(self):
        global numbers
        '''
        管理员登录
        1:获取管理员账号与密码
        2:将获取到的账号与密码与数据库文件配对,配对成功返回值为正确,否则为错误
        3:将返回值判断,正确则登录界面清除,登录界面图片清除,进入管理员界面
        异常捕获:未填写账号或者密码
        '''
        try:
            Admin_number=self.student_number.get()
            #print(User_id)
            Admin_pw=self.student_pw.get()
            #print(User_pw)
#             pd=admin_Select_id_pw(Admin_id,Admin_pw)
#             if pd:
            if Admin_number=="1" and Admin_pw=="1":
                self.page.destroy()
                self.lab3.pack_forget()
                AdminPage(self.root)
            else:
                showinfo(title='错误', message='账号或密码错误!')
        except:
                showinfo(title='错误',message='输入错误,请重新输入!')

    def student_loginCheck(self):
        global numbers,i
        '''
        学生登录
        1:获取学生学号与密码
        2:将获取到的学号与密码与数据库文件配对,配对成功返回值为正确,否则为错误
        3:将返回值判断,正确则登录界面清除,登录界面图片清除,进入用户界面,异常捕获:未填写账号或者密码
        '''
        try:
            Student_number=self.student_number.get()
            #print(User_id)
            Student_pw=self.student_pw.get()
            #print(User_pw)
            pd_student=user_slect_number_pw(Student_number,Student_pw)
            pd_teacher=teacher_slect_number_pw(Student_number,Student_pw)
            if pd_student:
                numbers=Student_number
                self.page.destroy()
                self.lab3.pack_forget()
                StudentPage(self.root)
            elif pd_teacher:
                numbers=Student_number
                self.page.destroy()
                self.lab3.pack_forget()
                TeacherPage(self.root)
            elif i>2:
                showinfo(title='错误', message='密码三次输入错误,此次登录被终止!')
                self.root.destroy()
            else:
                i+=1
                showinfo(title='错误', message='账号或密码错误!')
        except:
            showinfo(title='错误',message='输入错误,请重新输入!')
                
    
    def signup(self):
        '''
        学生注册页面
        1:新建一个置于顶层的窗口
        2:将布局控件放入
        3:每个窗口的控件布局必须是一致的,place(),grid(),pack()中的一种
        '''
        def insert_sql():
            '''
            添加学生
            1:获取学生姓名,年龄,学号,密码
            2:将获取到的账号与数据库文件配对,查看是否存在相同学号,如不存在,将学生插入数据库文件,存在则提示修改账户名
            异常捕获:信息未填写
            '''
            try:
                age = self.new_age.get()
                number = self.new_number.get()
                name = self.new_name.get()
                pw = self.new_pw.get()
                if len(number) < 12:
                    showinfo(title='提示', message='学号为12位的数字,请重新输入!')
                else:
                    XWC=user_showdb(number)#先判断账号是否存在于学生或者教师数据库
                    SHB=teacher_showdb(number)
                    if XWC == None and SHB == None:
                        user_insertData(number,name,pw,age)
                        showinfo(title='提示', message='注册成功')
                        self.window_sign_up.destroy()
                    else:
                        self.window_sign_up.destroy()
                        showinfo(title='提示',message='学号重复,注册失败,请修改学号!')  
            except:
                self.window_sign_up.destroy()
                showinfo(title='错误',message='未知错误,请重新输入!')
                

        self.window_sign_up = Toplevel(self.root)
        winWidth = 300
        winHeight = 200
        self.window_sign_up.title('注册窗口')
        screenWidth = self.window_sign_up.winfo_screenwidth()
        screenHeight = self.window_sign_up.winfo_screenheight()
        x = int((screenWidth - winWidth) / 2)
        y = int((screenHeight - winHeight) / 2)
        # 设置窗口初始位置在屏幕居中
        self.window_sign_up.geometry("%sx%s+%s+%s" % (winWidth, winHeight, x-50, y-50))
        # 设置窗口图标
        # root.iconbitmap("./image/icon.ico")
        # 设置窗口宽高固定
        self.window_sign_up.resizable(0, 0)
        

        self.new_name = StringVar()
        Label(self.window_sign_up, text='姓名: ').place(x=10, y=10) 
        entry_new_name = Entry(self.window_sign_up, textvariable=self.new_name) 
        entry_new_name.place(x=130, y=10)

        self.new_age= StringVar()
        Label(self.window_sign_up, text='年龄: ').place(x=10, y=50)
        entry_usr_age = Entry(self.window_sign_up, textvariable=self.new_age)
        entry_usr_age.place(x=130, y=50)

        self.new_number = StringVar()
        Label(self.window_sign_up, text='学号: ').place(x=10, y=90)
        entry_student_number = Entry(self.window_sign_up, textvariable=self.new_number)
        entry_student_number.place(x=130, y=90)
        
        self.new_pw = StringVar()
        Label(self.window_sign_up, text='密码: ').place(x=10, y=130)
        entry_usr_pw = Entry(self.window_sign_up, textvariable=self.new_pw, show='*')
        entry_usr_pw.place(x=130, y=130)

        sign_up = Button(self.window_sign_up, text='注册', command=insert_sql)
        sign_up.place(x=237, y=160)

查看个人成绩

主要流程

  1. 查看成绩单按钮调用函数
  2. 函数新建一个置顶窗口
  3. 根据学号查询当前学生是否有成绩
    a=achievement_showdb(numbers)
  4. 获取成绩表每列名称根据查询返回的列表a进行遍历并用Label展示
    for i,j in enumerate(a): 
                    if i>=2:
                        strs=b[i]+":"+str(j)
                        Label(self.ach, text=strs).pack()

函数代码

 def print_ach(self):
        global numbers
        self.ach = Toplevel(self.root)
        self.ach.title('个人成绩单')
        winWidth = 300
        winHeight = 200
        screenWidth = self.ach.winfo_screenwidth()
        screenHeight = self.ach.winfo_screenheight()
        x = int((screenWidth - winWidth) / 2)
        y = int((screenHeight - winHeight) / 2)
        # 设置窗口初始位置在屏幕居中
        self.ach.geometry("%sx%s+%s+%s" % (winWidth, winHeight, x, y))
        # 设置窗口图标
        # root.iconbitmap("./image/icon.ico")
        # 设置窗口宽高固定
        self.ach.resizable(0, 0)
        b=achievement_lie_name()
        a=achievement_showdb(numbers)
        a=list(a)
        if len(a)==2:
            strs="暂无科目成绩,请等待教师添加"
            Label(self.ach, text=strs).pack()
        else:
            for i,j in enumerate(a): 
                if i>=2:
                    strs=b[i]+":"+str(j)
                    Label(self.ach, text=strs).pack()

获得当前登录帐号

思路

登录时获得登录账户并赋给全局变量

部分代码

def student_loginCheck(self):
        global numbers,i
        '''
        学生登录
        1:获取学生学号与密码
        2:将获取到的学号与密码与数据库文件配对,配对成功返回值为正确,否则为错误
        3:将返回值判断,正确则登录界面清除,登录界面图片清除,进入用户界面,异常捕获:未填写账号或者密码
        '''
        try:
            Student_number=self.student_number.get()
            #print(User_id)
            Student_pw=self.student_pw.get()
            #print(User_pw)
            pd_student=user_slect_number_pw(Student_number,Student_pw)
            pd_teacher=teacher_slect_number_pw(Student_number,Student_pw)
            if pd_student:
                numbers=Student_number   #此处获得登录账户并赋给全局变量numbers

 def createPage(self):
        """
        登录成功创建页面时加入全局变量numbers
        """
        global numbers
        strs="欢迎您!学号为:%s 的同学!"%numbers
        Label(self.root, text=strs).place(x=210, y=0

修改个人密码

页面布局

流程

  1. 首先加入全局变量numbers获得帐号
  2. 两个输入框反复确认密码是否输入一致
  3. 如果一致将获得的numbers与New_pw修改数据库原有数据
    user_alter_pw(numbers,New_pw)
  4. 当密码修改成功时摧毁此窗口并退出应用提示用户需重新启动应用并登录
    user_alter_pw(numbers,New_pw)
    print("学号为%s的学生已修改密码,新密码为:%s"%(numbers,New_pw))
    showinfo(title='提示',message='密码已修改,请重启软件重新登录!')
    self.root.destroy()

整体代码

def change_pw(self):
        def sure_change():
                global numbers
                try:
                    New_pw=self.new_pw.get()
                        #print(User_id)
                    New_pws=self.new_pws.get()
                        #print(User_pw)
                    if New_pw==New_pws:
                        user_alter_pw(numbers,New_pw)
                        print("学号为%s的学生已修改密码,新密码为:%s"%(numbers,New_pw))
                        showinfo(title='提示',message='密码已修改,请重启软件重新登录!')
                        self.root.destroy()
                    else:
                        showinfo(title='错误',message='两次密码不一致,请重新输入!')
                except:
                    showinfo(title='错误',message='未知错误,请重新输入!')
        global numbers
        self.change_pw = Toplevel(self.root)
        self.change_pw.title('修改密码')
        winWidth = 230
        winHeight = 210
        screenWidth = self.change_pw.winfo_screenwidth()
        screenHeight = self.change_pw.winfo_screenheight()
        x = int((screenWidth - winWidth) / 2)
        y = int((screenHeight - winHeight) / 2)
        # 设置窗口初始位置在屏幕居中
        self.change_pw.geometry("%sx%s+%s+%s" % (winWidth, winHeight, x, y))
        # 设置窗口图标
        # root.iconbitmap("./image/icon.ico")
        # 设置窗口宽高固定
        self.change_pw.resizable(0, 0)
        self.new_pw = StringVar()
        self.new_pws = StringVar() 
        Label(self.change_pw, text='请输入新密码').place(x=110, y=0)
        Label(self.change_pw, text='新密码: ').place(x=25, y=20)
        Entry(self.change_pw, textvariable=self.new_pw, show='*').place(x=70, y=20)
        Label(self.change_pw, text='重复新密码: ').place(x=0, y=50)
        Entry(self.change_pw, textvariable=self.new_pws, show='*').place(x=70, y=50)
        Button(self.change_pw, text='确认修改',command=sure_change).place(x=90, y=90)

导出个人成绩单

流程

该模块比较简单就不详细写了

  1. 首先加入全局变量numbers获得帐号
  2. 使用帐号查询数据库内容并获得返回
  3. 将返回的内容添加至新列表
  4. 将新列表作为参数进行新建成绩单的数据源

具体代码

def ach_dao_xls(self):
    try:
        global numbers
        a=achievement_showdb(numbers)
        a=tuple(a)
        b=achievement_lie_name()
        c=[]
        c.append(tuple(b))
        c.append(a)
        def w_excel(res):
            book = xlwt.Workbook(encoding='utf-8') #新建一个excel
            sheet = book.add_sheet('sheet1') #新建一个sheet页
            for row in range(0,len(res)):
                for col in range(0,len(res[row])):
                    sheet.write(row,col,res[row][col])
                row+=1
                col+=1
            book.save('%s_student_achievement.xls'%numbers)
            print("导出成功!")
        w_excel(c)
        showinfo(title='确认', message='导出成功!')
    except:
        showinfo(title='错误', message='未知错误,请重新导出!')

CSDN所上传的文件资源里有小问题的bug

我在史上最全面的python学生管理系统教程(一)说了下有个bug,该bug存在于教师模块,当数据库完全没有时(没有学生已经成绩表)教师两个模块功能(查看学生成绩单,修改学生成绩)皆失效,点击按钮进去页面一片空白,后来细想了一下找到问题所在并进行更改,快速更改方法:记事本打开LoginPage.py 文件,Ctrl+F输入下面的一部分代码进行查找。

更改后代码 

学生页面的查看个人成绩单功能模块:


        b=achievement_lie_name()
        a=achievement_showdb(numbers)
        a=list(a)
        """
        下面的if判断的资源文件没有的,如在资源文件下载了,请自行添加进去,当然可执行程序也需要 
        重新打包
        """
        if len(a)==2:
            strs="暂无科目成绩,请等待教师添加"
            Label(self.ach, text=strs).pack()

教师页面的两个功能模块:

两处:将a的初始值赋值为["无"]

第一处,查看成绩函数:

def change_ach(self)

# print(b)
a=["无"]   ####该初值赋值为["无"],资源文件初值为[]
       
      

第二处,修改成绩函数:

def print_student_ach(self)

# print(b)
a=["无"]  ####该初值赋值为["无"],资源文件初值为[]

结语

    至此此次编写python学生管理系统完结,教师模块还有管理员模块就不去细写了,很多代码都是如出一辙的,并且大部分代码都带有注释,确有不懂的同学可以留言或者私聊我,有能力解决的话万死不辞。编写不易,求学艰辛,若不如您法眼,还望各位多多包容。

史上最全面的python学生管理系统教程(一)

史上最全面的python学生管理系统教程(二)

发布了21 篇原创文章 · 获赞 14 · 访问量 4097

猜你喜欢

转载自blog.csdn.net/Cxk___/article/details/103979556