学生信息管理系统(Python+PySimpleGUI+MySQL)

吐槽一下 

        经过一段时间学习pymysql的经历,我深刻的体会到了pymysql的不靠谱之处;

        就是在使用int型传参,我写的sql语句中格式化%d了之后,我在要传入的数据传递的每一步的去强制转换了,但是他还是会报错,说我的传入参数是string,他要int,我真笑了,最后把%d换成%s结果可以了,,,然后经过我查资料才了解到pymysql他这个库会去自动匹配类型,那也就是说在使用过程中可以对数据类型的关注可以降低一点,让库来给我解决数据类型不匹配的问题

        好了,吐槽就完了,然后就是现在的代码以及内容展示了

可视化展示

登录

在这里会去获取mysql中数据库db1的表user中的数据,然后会进行判断,成立下一步,不成立,会弹出弹窗,进行警告,成立就进入菜单

然后点击左上角的”点击进行操作吧“下面的按钮是假的哈哈哈哈哈哈哈哈哈。

编辑操作

 

这里删除之后需要关闭系统,可能是因为我这里有缓存的原因

查询操作

在这里去查询所有信息就会返回如图弹窗

按学号查询

按姓名查询

按性别查询

按年龄查询

 按专业查询

别问我为什么不在这里去做个选择菜单,那就和性别一样了,懒得再进行加工了

按照班级查询

 

 代码

main文件

from GUI import GUIif __name__ == '__main__':gui = GUI()gui.get_in()

GUI文件

import PySimpleGUI as sg
from LoginDatabase import LoginDatabase
from Editor import Editor
from Find import Findsg.theme('BlueMono')class GUI(object):def __init__(self):self.db_login_conn = LoginDatabase()self.db_login = self.db_login_conn.login_database_connect_gui()self.find = Find()self.editor = Editor()def get_in(self):layout = [[sg.Image(r'E:\Student_Manager_MySQL\th.png')],[sg.T('账号'), sg.InputText(default_text='1', key='first')],[sg.T('密码'), sg.InputText(default_text='1', key='second')],[sg.B('登录', key='login', button_color='blue'), sg.B('重置', key='rollback', button_color='blue')]]window = sg.Window('登录框', layout, text_justification='center')while True:event, values = window.read()if event is None:breakif event == 'login':sg.popup_auto_close('进入检测中,请等待')if values['first'] == self.db_login[0] and values['second'] == self.db_login[1]:sg.popup_auto_close("账号密码正确,请做好准备,即将进入系统——3 2 1 ")self.menu()else:sg.popup_auto_close('输入账号或密码错误,你到底是谁,再错我可要报警了奥')if event == 'rollback':window['first'].update('')window['second'].update('')window.close()def menu(self):menu_def = [['点击进行操作吧', ['添加学生', '删除学生', '修改学生', '查询学生']]]layout = [[sg.Image(r'E:\Student_Manager_MySQL\th.png')],[sg.T('您好,欢迎您使用本系统,请进行操作', size=(20, 5), font=('宋体', 15))],[sg.Menu(menu_def, key='manage_student', size=(20, 20), font=(15, 20))],[sg.B('点击进入系统', size=(10, 5), button_color='blue', key='点击进入系统'),sg.B('点击退出系统', size=(10, 5), button_color='red', key='点击退出系统')]]window = sg.Window('菜单', layout=layout)while True:event, values = window.read()if event in (None, '退出'):breakif event == '添加学生':sg.popup_auto_close('你就添加吧,等一会再告诉你怎么写')self.add_student_gui()if event == '查询学生':self.find_student_gui()if event == '修改学生':self.change_student_gui()if event == '删除学生':self.delete_student_gui()if event == '点击进入系统':sg.popup_auto_close('被骗了吧,哈哈哈哈哈', button_color='red')if event == '点击退出系统':sg.popup_auto_close('这是真的退出了')breakwindow.close()# 添加学生信息def add_student_gui(self):layout = [[sg.T("姓名"), sg.In(default_text='请不要设置过长', key='-name-')],[sg.T("性别"), sg.OptionMenu(values=['男', '女'], key='-gender-')],[sg.T("年龄"), sg.In(default_text='请输入整数(必须输入内容)', key='-age-')],[sg.T("专业"), sg.OptionMenu(values=['软件工程', '物联网工程', '大数据', '网络工程'], key='-major-')],[sg.T("班级"), sg.Combo(values=['1班', '2班'], key='-classroom-')],[sg.B(button_text="添加", key='-add-'), sg.B(button_text="退出", key='-exit-')]]window = sg.Window(title='添加学生', layout=layout)while True:event, values = window.read()if event is None:breakif event == '-exit-':breakif event == '-add-':# print(int(values['-age-']))# print(type(int(values['-age-'])))(self.editor.insert_student(values['-name-'], values['-gender-'],values['-classroom-'], int(values['-age-']), values['-major-']))sg.popup_auto_close('添加成功')breakwindow.close()# 查询学生信息def find_student_gui(self):layout = [[sg.B('按照学号查询', key='find_id')],[sg.B('按照姓名查询', key='find_name')],[sg.B('按照性别查询', key='find_gender')],[sg.B('按照年龄查询', key='find_age')],[sg.B('按照专业查询', key='find_major')],[sg.B('按照班级查询', key='find_classroom')],[sg.B('查询所有信息', key='find_all')]]window = sg.Window('查询学生', layout)while True:event, values = window.read()if event is None:breakif event == 'find_id':layout_id = [[sg.T('请输入要查询的学生学号id'), sg.In('', key='id')],[sg.B('确认', key='id_ok')]]window_id = sg.Window('查询学生id', layout_id)while True:event_id, values_id = window_id.read()if event_id is None:breakif event_id == 'id_ok':sg.popup(self.find.find_id(int(values_id['id'])))window_id.close()if event == 'find_name':layout_name = [[sg.T('请输入要查询的学生姓名name'), sg.In('', key='name')],[sg.B('确认', key='name_ok')]]window_name = sg.Window('查询学生姓名name', layout_name)while True:event_name, values_name = window_name.read()if event_name is None:breakif event_name == 'name_ok':print(values_name['name'])sg.popup(self.find.find_name(values_name['name']))window_name.close()if event == 'find_gender':layout_gender = [[sg.T('请输入要查询的学生性别gender'), sg.In('', key='gender')],[sg.B('确认', key='gender_ok')]]window_gender = sg.Window('查询学生性别gender', layout_gender)while True:event_gender, values_gender = window_gender.read()if event_gender is None:breakif event_gender == 'gender_ok':print(values_gender['gender'])sg.popup(self.find.find_gender(str(values_gender['gender'])))window_gender.close()if event == 'find_age':layout_age = [[sg.T('请输入要查询的学生年龄age'), sg.In('', key='age')],[sg.B('确认', key='age_ok')]]window_age = sg.Window('查询学生年龄age', layout_age)while True:event_age, values_age = window_age.read()if event_age is None:breakif event_age == 'age_ok':print(values_age['age'])sg.popup(self.find.find_age(int(values_age['age'])))window_age.close()if event == 'find_major':layout_major = [[sg.T('请输入要查询的学生专业major'), sg.In('', key='major')],[sg.B('确认', key='major_ok')]]window_major = sg.Window('查询学生专业major', layout_major)while True:event_major, values_major = window_major.read()if event_major is None:breakif event_major == 'major_ok':print(values_major['major'])sg.popup(self.find.find_major(str(values_major['major'])))window_major.close()if event == 'find_classroom':layout_classroom = [[sg.T('请输入要查询的学生班级classroom'), sg.In('', key='classroom')],[sg.B('确认', key='classroom_ok')]]window_classroom = sg.Window('查询学生班级classroom', layout_classroom)while True:event_classroom, values_classroom = window_classroom.read()if event_classroom is None:breakif event_classroom == 'classroom_ok':sg.popup(self.find.find_classroom(str(values_classroom['classroom'])))window_classroom.close()if event == 'find_all':result = self.find.get_all_students()sg.Popup(result)window.close()# 删除学生def delete_student_gui(self):layout = [[sg.T('请输入要删除的学生的学号'), sg.In('', key='id')],[sg.B('确认'), sg.B('取消')]]window = sg.Window('删除学生', layout)while True:event, values = window.read()if event is None:breakif event == '确认':self.editor.delete_student(int(values['id']))sg.popup_auto_close('删除成功')breakif event == '取消':breakwindow.close()# 修改学生信息def change_student_gui(self):layout = [[sg.T('请输入要修改的学生的学号'), sg.In(key='change_id')],[sg.B('确认'), sg.B('取消')]]window = sg.Window('修改学生', layout)while True:event, values = window.read()if event is None:breakif event == '确认':self.find.find_id(values['change_id'])name = self.find.find_id(int(values['change_id']))[0]gender = self.find.find_id(values['change_id'])[1]classroom = self.find.find_id(values['change_id'])[2]age = self.find.find_id(values['change_id'])[3]major = self.find.find_id(values['change_id'])[4]layout_change = [[sg.T('姓名'), sg.In(default_text=name, key='change_name')],[sg.T('性别'), sg.In(default_text=gender, key='change_gender')],[sg.T('班级'), sg.In(default_text=classroom, key='change_classroom')],[sg.T('年龄'), sg.In(default_text=age, key='change_age')],[sg.T('专业'), sg.In(default_text=major, key='change_major')],[sg.B('修改', key='change_ok')]]window_change = sg.Window(title='修改框', layout=layout_change)while True:event_change, values_change = window_change.read()if event_change is None:breakif event_change == 'change_ok':self.editor.update_student(student_id=values['change_id'], name=values_change['change_name'],gender=values_change['change_gender'],classroom=values_change['change_classroom'],age=values_change['change_age'], major=values_change['change_major'])sg.popup_auto_close('更新成功')breakwindow_change.close()if event == '取消':breakwindow.close()

DatabaseConnect文件

import pymysql
import jsonclass DatabaseConnect(object):def __init__(self):# 选择json文件进行存储必需数据with open(r'E:\Student_Manager_MySQL\database_login.json', 'r') as f:db_config = json.load(f)self.host = db_config['host']self.port = db_config['port']self.username = db_config['username']self.password = db_config['password']self.database = db_config['database']self.charset = db_config['charset']def connect_database(self):try:db = pymysql.connect(host=self.host,port=self.port,user=self.username,password=self.password,database=self.database,charset=self.charset)# print('数据库连接成功')# 返回dbreturn dbexcept pymysql.Error as e:print('数据库连接失败' + str(e))

LoginDatabase文件

from DatabaseConnect import DatabaseConnectclass LoginDatabase(object):def __init__(self):# 创建database_connect()类的对象self.db_connect = DatabaseConnect()# 给self.db赋值为dbself.db = self.db_connect.connect_database()def login_database_connect_gui(self):# 创建游标对象cur = self.db.cursor()# 写sql语句sqlquery = 'select * from user'# 执行SQL语句cur.execute(sqlquery)# 获取SQL语句的返回值results = list(cur.fetchall())# print(results)result = []for i in results:for j in i:result.append(j)# print(result)return result# print(results)
#
#
# db_connect = database_login()
# db_connect.login_database_connect_gui()

Editor文件

from LoginDatabase import LoginDatabaseclass Editor(LoginDatabase):def __init__(self):super().__init__()# 添加学生def insert_student(self, name, gender, classroom, age, major):# try:cur = self.db.cursor()values = (name, int(age), major, gender, classroom)sql = "INSERT INTO students (name, age, major, gender, classroom) VALUES (%s, %s, %s, %s, %s)"cur.execute(sql, values)self.db.commit()# xiube = '你回去检查一下你输入的年龄'# except Exception as e:# return xiube# 修改学生def update_student(self, student_id, name, age, classroom, gender, major):cur = self.db.cursor()sql = "UPDATE students SET name = %s, gender = %s, age = %s, major = %s, classroom = %s WHERE id = %s"values = (name, gender, age, major, classroom, student_id)cur.execute(sql, values)self.db.commit()# 删除学生def delete_student(self, student_id):cur = self.db.cursor()sql = "DELETE FROM students WHERE id = %s"cur.execute(sql, (student_id,))self.db.commit()

Find文件

from LoginDatabase import LoginDatabase# 查询信息
class Find(LoginDatabase):def __init__(self):super().__init__()# 访问所有学生def get_all_students(self):cur = self.db.cursor()cur.execute("SELECT * FROM students")results = list(cur.fetchall())print(results)return results# 访问iddef find_id(self, student_id):cur = self.db.cursor()sql = 'select name,gender,classroom,age,major from students where id=%s ' % student_idcur.execute(sql)list_1 = []result = list(cur.fetchall())for i in result:for j in i:list_1.append(j)return list_1# 访问姓名def find_name(self, name):cur = self.db.cursor()sql = 'select * from students where name like %s'cur.execute(sql, (f'%{name}%',))result = cur.fetchall()return result# 访问性别def find_gender(self, gender):cur = self.db.cursor()sql = 'select * from students where gender=%s'cur.execute(sql, gender)result = cur.fetchall()return result# 访问班级def find_classroom(self, classroom):cur = self.db.cursor()sql = 'select * from students where classroom like %s'cur.execute(sql, (f"%{classroom}%",))result = cur.fetchall()return result# 访问年龄def find_age(self, age):cur = self.db.cursor()sql = 'select * from students where age=%d' % agecur.execute(sql)result = cur.fetchall()return result# 访问专业def find_major(self, major):cur = self.db.cursor()sql = 'select * from students where major=%s'cur.execute(sql, major)result = cur.fetchall()return result

json文件

{"host": "localhost","port": 3306,"username": "root","password": "1234","database": "db1","charset": "utf8mb4"
}
# 如果要用json那就要把用户名username改成你的用户名,密码和数据库相应也要改成你的

 关于可视化中图片

可视化界面中的图片是从网络找的,当然末尾也是找的;

结尾

        好了,就到这里了,这一个版本的系统需求基本实现了,缺少一个用户类,然后细分管理员以及普通用户,但是系统功能都实现了,没关系,版本迭代是迟早的,如果有需要可以私信我要源码,如果之后版本迭代的系统我也写出来了,那当然可以给你了。

        如有高见,请指教,如若有所收获,还是感激不尽。

灰太狼的大表哥-CSDN博客感谢灰太郎的大表哥给予我的一些关于pymysql的指导。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

决策树可解释性分析

决策树可解释性分析 决策树是一种广泛使用的机器学习算法,以其直观的结构和可解释性而闻名。在许多应用场景中,尤其是金融、医疗等领域,模型的可解释性至关重要。本文将从决策路径、节点信息、特征重要性等多个方面分析决策树的可解释性&…

k8s集群的资源发布方式(滚动/蓝绿/灰度发布)及声明式管理方法

目录 1.常见的发布方式 2.滚动发布 3.蓝绿发布 4.实现金丝雀发布(Canary Release) 5.声明式管理方法 1.常见的发布方式 蓝绿发布:两套环境交替升级,旧版本保留一定时间便于回滚优点:用户无感知,部署和回滚速度较…

如何通过前端表格控件实现自动化报表?

背景 最近伙伴客户的项目经理遇见一个问题,他们在给甲方做自动化报表工具,项目已经基本做好了,但拿给最终甲方,业务人员不太买账,项目经理为此也是天天抓狂,没有想到合适的应对方案。 现阶段主要面临的问…

chrome/edge浏览器插件开发入门与加载使用

同学们可以私信我加入学习群! 正文开始 前言一、插件与普通前端项目二、开发插件——manifest.json三、插件使用edge浏览器中使用/加载插件chrome浏览器中使用/加载插件 总结 前言 chrome插件的出现,初衷可能是为了方便用户更好地控制浏览器&#xff0c…

C++ | 类和对象(下)(static成员、友元、内部类、匿名对象)

目录 ​编辑 static成员 static性质简介 static属于整个类,属于所有对象 static成员的声明与定义 static函数 友元friend 友元特性简介 友元关系讲解 内部类 特性一 特性二 匿名对象 结语 static成员 static性质简介 static成员在类里面是非常独特的…

Golang之OpenGL(一)

使用OpenGL实现窗口中绘制三角形(纯色|彩色)、正方形(变色) 一、简单实现窗口绘制三角形二、绘制的多颜色三角形(基于 ‘ 简单实现窗口绘制三角形 ’ )1、在顶点着色器和片段着色器中添加了颜色的输入和输出…

反制攻击者-蚁剑低版本

目录 安装 攻击者获取防守方的权限 防守方反制攻击者 防守方获取攻击者的shell权限 安装 安装蚁剑2.0.7版本 链接:https://pan.baidu.com/s/1t40UxkZ2XuSWG6VCdGzvDw?pwd8888 提取码:8888 下载好后先打开Loader文件夹下的.exe文件,打…

赛蓝企业管理系统 AuthToken/Index 身份认证绕过漏洞复现

0x01 产品简介 赛蓝企业管理系统是一款为企业提供全面管理解决方案的软件系统,它能够帮助企业实现精细化管理,提高效率,降低成本。系统集成了多种管理功能,包括但不限于项目管理、财务管理、采购管理、销售管理以及报表分析等&am…

【iOS】——GCD总结

同步和异步的区别 同步执行等待操作完成,而异步执行允许程序在操作完成前继续运行,提高了效率和响应性。这里的关键就是上一个操作需不需要等待当前操作的执行,如果需要就是同步,如果不需要就是异步。 异步有开启新线程的能力但…

合作伙伴中心Partner Center中添加了Copilot预览版

目录 一、引言 二、Copilot 功能概述 2.1 Copilot 简介 2.2 Copilot 的核心功能 2.3 Copilot 的访问和使用 三、Copilot 的使用方法 3.1 Copilot 功能区域 3.2 Copilot 使用示例 3.2.1 编写有效提示 3.2.2 使用反馈循环 四、负责任的人工智能 4.1 Copilot 结果的可…

Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入|删除段落|删除标签

本教程主要实现【Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入|删除段落|删除标签】。 本文源码:https://gitee.com/songfayuan/go-zero-demo 教程源码分支:master 分支(_examples/word-template/fill-word-template.go&…

win 10 局域网共享

1,打开共享 控制面板\网络和 Internet\网络和共享中心\高级共享设置 (在控制面板界面建议使用大图片或小图标容易找到目标) 或者直接复制红色部分,然后打开此电脑,粘贴到地址栏直接回车即可直接到达几面 打开如下2个…

达梦数据库一体机在宜昌市财政局上线了!

财政作为国家治理的基础和重要支柱,其数字化转型已成为构建现代财政制度的必由之路,引领着财政管理体系向更高效、更智能的方向迈进。 达梦数据全面助力财政信息化转型与智能化发展,采用 DAMEGN PAI I 系列数据库一体机,为宜昌市财…

Unity Camera

课程目标 1. 了解摄像机(camera)不同视角的设计与实现;2. 感受在不同摄像机视角下观察虚拟场景。 喜欢玩游戏或者看3D动漫的朋友可以回忆在虚拟场景中摄像头的运动变化带来的视觉感受,例如:摄像头给场景中的主角来个…

马来西亚原生静态IP注册的账号稳定吗?

马来西亚作为东南亚重要的经济体之一,其网络基础设施和互联网服务水平在近年来有了显著提升。静态IP作为一种固定的互联网协议地址,对于某些特定的网络应用和需求非常重要。本文将围绕马来西亚原生静态IP注册的账号稳定性进行探讨,分析其在不…

【Python系列】Python 字典合并

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

pytorch基础模块:Tensorboard、Dataset、Transforms、Dataloader

Tensorboard、Dataset、Transforms、Dataloader 该文档主要参考【土堆】的视频教程:pytorch入门教程–土堆 一、Tensorboard 安装tensorboard:pip install tensorboard 使用步骤: 引入相关库:from torch.utils.tensorboard i…

LinkedList接口源码解读

LinkedList 接口源码解读(一) 前言 因为追求质量,所以写的较慢。大概在接下来的三天内会把LinkedList源码解析出完。大概还有两篇文章。废话不多说,正片开始! 大家都知道,LinkedList是在Java底层中是由 …

手机上音乐如何转换成MP3格式?分享5款音频格式转换APP

手机上音乐如何转换成MP3格式?相信很多外出办公或者不经常使用电脑的工作人士,学生党,媒体从业者都有这样的疑惑和需求。不同设备和应用可能支持不同的音频格式,导致某些情况下需要将音乐文件转换为MP3格式以确保兼容性。下面&…

操作系统|day4.Linux、Linux内核、Linux负载、Linux文件存储

文章目录 LinuxLinux内核定义功能态 Linux负载定义 Linux文件存储链接分类区别使用场景 拷贝 Linux Linux内核 定义 内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能…