python期末大作业:学生信息管理系统(界面+数据库)!

大学生党们又到期末了,今天跟大家分享一下一个python期末大作业的开发思路。大家可以参考思路自己修改完善。我们讲解的是学生信息管理系统。界面还是用tkinter做,数据库使用sqlite。

先看一下软件截图

在这里插入图片描述

数据库设计

在这里插入图片描述

在这里插入图片描述

=在这里插入图片描述

编写过程

1.导库

from tkinter import *
from tkinter.messagebox import askokcancel, showinfo
import tkinter.ttk as ttk
from sqlite3 import *

2.初始化

root = Tk()
systitle = '学生信息管理系统'  # 系统标题
dbfile = 'student.db'  # v2
cn = connect(dbfile)  # v2连接数据库,连接对象cn
operateFrame = Frame()  # 功能窗口
operateFrame.pack()

3.定义软件主界面函数

def main():
root.geometry('600x400')  # 设置窗口初始大小
root.title(systitle)  # 设置系统标题
# 创建系统菜单
menubar = Menu(root)  # 创建Menu对象menubar,将作为root窗口中的菜单    
root.config(menu=menubar)  # 将menubar菜单作为root窗口的顶层菜单栏   
# menuStudent将作为menubar菜单的子菜单
menuStudent = Menu(menubar, tearoff=0)
menuStudent.add_command(label='添加新学生', font=('宋体', 10),                           
command=addStudent)
menuStudent.add_command(label='显示全部学生信息', font=('宋体', 10),                         
command=showAllStudent)
menuStudent.add_command(label='查找/修改/删除学生信息', font=('宋体', 10),                         
command=checkUpdateStudent)
menuStudent.add_separator()
menuStudent.add_command(label='退出', font=('宋体', 10), command='')
# 菜单file添加为menubar的子菜单
menubar.add_cascade(label='学生管理', font=('宋体', 10), menu=menuStudent)
menuHelp = Menu(menubar, tearoff=0)  # help将作为menubar菜单的子菜单
menuHelp.add_command(label='查看日志', font=('宋体', 10), command='')
menuHelp.add_command(label='关于...', font=('宋体', 10), command='')
# 菜单help添加为menubar的子菜单
menubar.add_cascade(label='其他', font=('宋体', 10), menu=menuHelp)
root.mainloop()

4.定义添加学生信息子界面函数

def addStudent():
for widget in operateFrame.winfo_children():  # 清空窗口中原有的所有内容    
widget.destroy()
f1 = Frame(operateFrame)
f1.pack()
studentIdVar = StringVar()
studentNameVar = StringVar()
ageVar = StringVar()
telVar = StringVar()
lStudentId = Label(f1, text='学号:')
lStudentName = Label(f1, text='姓名:')
lAge = Label(f1, text='年龄:')
lTel = Label(f1, text='电话:')
tStudentId = Entry(f1, textvariable=studentIdVar)
tStudentName = Entry(f1, textvariable=studentNameVar)
tAge = Entry(f1, textvariable=ageVar)
tTel = Entry(f1, textvariable=telVar)
lStudentId.grid(row=1, column=1)
lStudentName.grid(row=2, column=1)
lAge.grid(row=3, column=1)
lTel.grid(row=4, column=1)
tStudentId.grid(row=1, column=2)
tStudentName.grid(row=2, column=2)
tAge.grid(row=3, column=2)
tTel.grid(row=4, column=2)
f2 = Frame(operateFrame)
f2.pack(pady=20)
bReset = Button(f2, text='重置')
bSave = Button(f2, text='保存')
bReset.grid(row=1, column=1)
bSave.grid(row=1, column=2)
def reset():
studentIdVar.set('')
studentNameVar.set('')
ageVar.set('')
telVar.set('')
bReset.config(command=reset)
def save():#event
try:
id = studentIdVar.get()
if not id.isdigit():
raise Exception('学号必须为数字!')
elif len(id) != 4:
raise Exception('学号必须是4位!')
name = studentNameVar.get()
age = ageVar.get()
if not age.isdigit():                
raise Exception('年龄错误!')            
else:                
age = int(age)
if age < 15 or age > 50:
raise Exception('年龄必须大于15小于50!')            
tel = telVar.get()            
if not tel.isdigit():                
raise Exception('电话错误!')            
elif len(tel) != 4:                
raise Exception('电话必须4位!')
# 向数据库发送插入指令
cn.execute('INSERT INTO student VALUES(?,?,?,?)',
(id, name, age, tel))
cn.commit()
showinfo(systitle, '成功添加新学生!')
reset()
tStudentId.focus()
# 测试:向数据库发一个查询指令
# 获得了一个列表,列表中每个单元是一个学生,每个学生是一个元组
# stulist = cn.execute('SELECT * FROM student').fetchall()
# print(stulist)
except Exception as ex:
showinfo(systitle, ex)
bSave.config(command=save)
tTel.bind('<Return>', save)

5.定义显示所有学生信息子界面函数

# 6 显示所有学生
def showAllStudent():                    #v3    
for widget in operateFrame.winfo_children():  # 清空窗口中原有的所有内容
widget.destroy()
operateFrame.columnconfigure(1, minsize=50)
operateFrame.columnconfigure(2, minsize=100)
operateFrame.columnconfigure(3, minsize=50)
operateFrame.columnconfigure(4, minsize=100)
Label(operateFrame, text='学号',font=('宋体', 10, 'bold')
).grid(row=0, column=1)
Label(operateFrame, text='姓名',font=('宋体', 10, 'bold')
).grid(row=0, column=2)
Label(operateFrame, text='年龄',font=('宋体', 10, 'bold')
).grid(row=0, column=3)
Label(operateFrame, text='电话',font=('宋体', 10, 'bold')
).grid(row=0, column=4)
stulist = cn.execute('select * from student').fetchall()
rownum = 1
for stu in stulist:
colnum = 1
for info in stu:
Label(operateFrame, text=str(info),font=('宋体', 10)
).grid(row=rownum, column=colnum)
colnum += 1
rownum += 1

6.定义查找/修改/删除学生信息子界面函数

# 7. 查找删除修改学生
def checkUpdateStudent():                          #v4
for widget in operateFrame.winfo_children():  # 清空窗口中原有的所有内容        
widget.destroy()
f1 = LabelFrame(operateFrame,text='查找学生:')
f1.pack()
studentIdToSearchVar = StringVar()
Label(f1, text='请输入要查找的学生学号:').grid(row=1, column=1)
tStudentIdToSearch = Entry(f1,textvariable=studentIdToSearchVar)
tStudentIdToSearch.grid(row=1, column=2)
bSearch = Button(f1, text='查询')
bSearch.grid(row=1, column=3)
f2 = LabelFrame(operateFrame,text='删除与修改学生:')
f2.pack(pady=30)
fDelete = Frame(f2)
fDelete.pack()
bDelete = Button(fDelete,text='删除学生',state=DISABLED)
bDelete.pack()
fUpdate = Frame(f2)
fUpdate.pack()
studentIdVar = StringVar()
studentNameVar = StringVar()
ageVar = StringVar()
telVar = StringVar()
Label(fUpdate,text='学号:').grid(row=1,column=1)
Label(fUpdate, text='姓名:').grid(row=2, column=1)
Label(fUpdate, text='年龄:').grid(row=3, column=1)
Label(fUpdate, text='电话:').grid(row=4, column=1)
Entry(fUpdate,textvariable=studentIdVar,state=DISABLED).grid(row=1,column=2) 
Entry(fUpdate,textvariable=studentNameVar).grid(row=2, column=2)
Entry(fUpdate,textvariable=ageVar).grid(row=3, column=2)
Entry(fUpdate,textvariable=telVar).grid(row=4, column=2)
bSave = Button(fUpdate,text='保存修改',state=DISABLED)
bSave.grid(row=4,column=3)
def search(event=None):
studentIdVar.set('')
studentNameVar.set('')
ageVar.set('')
telVar.set('')
studentIdToSearch = studentIdToSearchVar.get()
print(type(studentIdToSearch ),studentIdToSearch )
stu = cn.execute('SELECT sid,sname,age,tel FROM student WHERE sid=?' ,(studentIdToSearch,)).fetchone()
print(stu)
if stu == None:
showinfo(systitle,'该学生不存在')
bSave.config(state=DISABLED)
bDelete.config(state=DISABLED)
else:
studentIdVar.set(stu[0])
studentNameVar.set(stu[1])
ageVar.set(stu[2])
telVar.set(stu[3])
bDelete.config(state=NORMAL)
bSave.config(state=NORMAL)
bSearch.config(command=search)
tStudentIdToSearch.bind("<Return>",search)
def delete():
cn.execute('DELETE FROM student WHERE sid=?',(studentIdVar.get(),))
cn.commit()
showinfo(systitle,'成功删除!')
studentIdVar.set('')
studentNameVar.set('')
ageVar.set('')
telVar.set('')
bDelete.config(command=delete)
def save():
cn.execute('UPDATE student SET sname=?,age=?,tel=? WHERE sid=?' ,
(studentNameVar.get(),ageVar.get(),telVar.get(),studentIdVar.get()))
cn.commit()
showinfo(systitle,'成功修改!')
bSave.config(command=save)

7.在程序主入口调用main()函数,启动软件主界面。

if __name__ == '__main__':
main()

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

点击领取 100%免费

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方优快云官方认证二维码或者点击链接免费领取保证100%免费

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/711c5966aa7348dc9340894eea54e99f.png#pic_center在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值