目录
序言
注册与登录
了解python tkinter库的使用
登录界面布局
构思
图片来源
细节处理
注册窗口
构思
细节处理
注册与登录整体代码
查看个人成绩
主要流程
函数代码
获得当前登录帐号
思路
部分代码
修改个人密码
页面布局
流程
整体代码
导出个人成绩单
流程
具体代码
CSDN所上传的文件资源里有小问题的bug
更改后代码
学生页面的查看个人成绩单功能模块:
教师页面的两个功能模块:
结语
史上最全面的python学生管理系统教程(一)
史上最全面的python学生管理系统教程(二)
这篇将开始软件中学生页面的开发过程,将分为以下几个板块:注册与登录,查看个人成绩,获得当前登录帐号,修改个人密码,导出个人成绩单。
这里有很详细的教程,很重要,如果不懂使用就看不懂代码
我是根据网上免费文字签名设计加上图片去底实现学校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('',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('',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)
a=achievement_showdb(numbers)
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
user_alter_pw(numbers,New_pw)
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)
该模块比较简单就不详细写了
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='未知错误,请重新导出!')
我在史上最全面的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学生管理系统完结,教师模块还有管理员模块就不去细写了,很多代码都是如出一辙的,并且大部分代码都带有注释,确有不懂的同学可以留言或者私聊我,有能力解决的话万死不辞。编写不易,求学艰辛,若不如您法眼,还望各位多多包容。