python学生信息管理系统(界面+数据库)

news2025/4/7 8:51:41

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

先看一下软件截图

图片数据库设计

图片

图片

图片

编写过程

1.导库

from tkinter import *
from tkinter.messagebox import askokcancel, showinfoimport 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()

.get(),studentIdVar.get()))

  cn.commit()        
  showinfo(systitle,'成功修改!')
  bSave.config(command=save)

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

if name == ‘main’: main()


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫---scrapy框架---当当网管道封装

项目结构&#xff1a; dang.py文件&#xff1a;自己创建&#xff0c;实现爬虫核心功能的文件 import scrapy from scrapy_dangdang_20240113.items import ScrapyDangdang20240113Itemclass DangSpider(scrapy.Spider):name "dang" # 名字# 如果是多页下载的话, …

动图搞懂三极管的工作原理

三极管的电流放大作用应该算是模拟电路里面的一个难点内容&#xff0c;我想用这几个动画简单的解释下为什么小电流Ib能控制大电流Ic的大小&#xff0c;以及放大电路的原理。 这里的三极管也叫双极型晶体管&#xff0c;模电的放大电路和数电的简单逻辑电路里面都会用到。有集电…

2. Git

2. Git Git简介 Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;。 Git有什么特点&#xff1f;简单来说就是&#xff1a;高端大气上档次&#xff01; 那什么是版本控制系统&#xff1f; 如果你用Microsoft Word写过长篇大…

HTML---Jquery选择器

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 会使用基本选择器获取元素会使用层次选择器获取元素会使用属性选择器获取元素会使用过滤选择器获取元素 …

rust跟我学二:模块编写与使用

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info中模块的使用。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Rust库更新]g…

yum仓库及NFS共享

目录 一、yum仓库 &#xff08;一&#xff09;yum仓库简介 &#xff08;二&#xff09;实现过程 &#xff08;三&#xff09;yum命令 &#xff08;四&#xff09;搭建内网yum仓库 1.FTP服务搭建yum仓库 ①服务端操作 ②客户端操作 2.http服务搭建yum仓库 ①服务端操作…

电路原理1-线性电阻

前言&#xff1a;整理笔记基于清华大学于歆杰老师的《电路原理》&#xff0c;电路原理是基于无源负载和电源组成电路的分析方法。 1.基础数学知识 算术&#xff1a;数字之间的运算 代数&#xff1a;用变量和函数来代替数字 微积分&#xff1a;描述函数的累积效应&#xff0…

【Python数据可视化】matplotlib之设置子图:绘制子图、子图共享x轴坐标、调整子图间距、设置图片大小

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

Informer简单理解

一、输入层Encoder改进&#xff1a; 1、ProbAttention算法计算权值&#xff1a; 原Transformer中的注意力机制时间复杂度N^2&#xff0c;而Informer作为实时性要求高的长时间序列预测算法必然需要提高效率&#xff0c;降低时间开销。 1.简化K&#xff1a; 对每个Q不再与所有…

073:vue+mapbox 加载here地图(影像瓦片图 v3版)

第073个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载here地图的影像瓦片图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共77行)相关API参考:专栏目标示例效果

Rust-Panic

什么是panic 在Rust中&#xff0c;有一类错误叫作panic。示例如下&#xff1a; 编译&#xff0c;没有错误&#xff0c;执行这段程序&#xff0c;输出为&#xff1a; 这种情况就引发了一个panic。在这段代码中&#xff0c;我们调用了Option::unwrap()方法&#xff0c;正是这个方…

Softmax回归(多类分类模型)

目录 1.对真实值类别编码&#xff1a;2.预测值&#xff1a;3.目标函数要求&#xff1a;4.使用Softmax模型将输出置信度Oi计算转换为输出匹配概率y^i&#xff1a;5.使用交叉熵作为损失函数&#xff1a;6.代码实现&#xff1a; 1.对真实值类别编码&#xff1a; y为真实值&#xf…

Java顺序表(2)

&#x1f435;本篇文章将对ArrayList类进行讲解 一、ArrayList类介绍 上篇文章我们对顺序表的增删查改等方法进行了模拟实现&#xff0c;实际上Java提供了ArrayList类&#xff0c;而在这个类中就包含了顺序表的一系列方法&#xff0c;这样在用顺序表解决问题时就不用每次都去实…

smartgit选择30天试用后需要输入可执行文件

突然有一天smartgit提示到期了&#xff0c;我按照以往那样删除license和preferences文件后&#xff0c;选择30天试用&#xff0c;弹出了需要选择git可执行文件。 我尝试选择了我的git.exe&#xff0c;发现根本不行&#xff0c;提示让我执行下git --version 执行过后提示我的.gi…

【Shell编程练习】编写 shell 脚本,打印 9*9 乘法表

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 监控内存和磁盘容量&#xff0c;小于给定值时报警 猜大小 输入三个数并进行升序排序 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态 系列文章目录编写 shell 脚本,打…

Vue3响应式系统(二)

Vue3响应式系统(一)https://blog.csdn.net/qq_55806761/article/details/135587077 六、嵌套的effect与effect栈。 什么场景会用到effect嵌套呢&#xff1f;听我娓娓道来。 就用Vue.js来说吧&#xff0c;Vue.js的渲染函数就是在effect中执行的&#xff1a; /*Foo组件*/ const…

动态路由协议

一、动态路由协议 动态路由协议&#xff0c;用在多个 Router 之间定期的、自动的、互相交换 Routes&#xff08;路由信息&#xff0c;包含了网段信息、可达性信息、路径信息等&#xff09;&#xff0c;动态生成 Routing Table Entries&#xff0c;并最终达到全网的路由收敛&am…

Java项目:123SSM高校运动会信息管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 高校运动会信息管理系统基于SpringSpringMVCMybatis开发&#xff0c;主要用来管理高校运动会信息&#xff0c;系统分为管理员何运动员两种角色。系统主要功…

AI在广告中的应用——预测性定位和调整

营销人员的工作就是在恰当的时间将适合的产品呈现在消费者面前&#xff0c;从而增加他们购买的可能性。随着时间的推移&#xff0c;营销人员能够深入挖掘越来越精准的客户细分市场&#xff0c;他们不仅具备了实现上述目标的能力&#xff0c;而且这种能力还在呈指数级提升。在AI…

如何将github copilot当gpt4用

现在写代码已经离不开ai辅助了我用的是github copilot&#xff0c;一方面是因为它和vscode结合得比较好&#xff0c;另一方面就是copilot chat了。可以在不切换工具的情况下&#xff0c;问它问题&#xff0c;在copilot chat还在内测阶段的时候我就申请使用了&#xff08;现在已…