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

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

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


## 修改个人密码


### 页面布局


![](https://img-blog.csdnimg.cn/20200214133314814.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0N4a19fXw==,size_16,color_FFFFFF,t_70)


### 流程


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©
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()



### 最后

> **🍅 硬核资料**:关注即可领取PPT模板、简历模板、行业经典书籍PDF。  
> **🍅 技术互助**:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。  
> **🍅 面试题库**:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。  
> **🍅 知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)**
![img](https://img-blog.csdnimg.cn/img_convert/7176ff45adbb57fff7bd0ae708b91251.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
领取PPT模板、简历模板、行业经典书籍PDF。  
> **🍅 技术互助**:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。  
> **🍅 面试题库**:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。  
> **🍅 知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)**
[外链图片转存中...(img-doilJEs3-1713075246610)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值