当前位置: 首页 > news >正文

学生信息管理系统(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的指导。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据分析模型:洞察数据背后的奥秘
  • 秒懂Linux之gdb调试
  • Linux 进程优先级、程序地址空间、进程控制
  • 数据恢复的定制之旅:打造SQL Server的专属恢复方案
  • 如何将PyCharm 中使用 PDM 管理的 Django 项目迁移到 VS Code 并确保一切正常工作?
  • 非传统题练习(自用)
  • 界面控件DevExpress WinForms,支持HTML CSS提升用户体验(一)
  • 做 DL-FWI 研究需要哪些知识和能力
  • 超详细的 Linux Conda 环境安装教程
  • 算法通关:015:最小栈
  • 基于el-table的表格点选和框选功能
  • 测试面试宝典(四十六)— 在项目中如何保证软件质量?
  • 数组的复制
  • C#初级——List 容器
  • C/C++开发,opencv光流法跟踪特征点
  • 分享一款快速APP功能测试工具
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • es的写入过程
  • HomeBrew常规使用教程
  • Less 日常用法
  • Mocha测试初探
  • Object.assign方法不能实现深复制
  • python学习笔记-类对象的信息
  • VUE es6技巧写法(持续更新中~~~)
  • yii2权限控制rbac之rule详细讲解
  • 订阅Forge Viewer所有的事件
  • 前嗅ForeSpider教程:创建模板
  • 软件开发学习的5大技巧,你知道吗?
  • 实战|智能家居行业移动应用性能分析
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一些css基础学习笔记
  • 因为阿里,他们成了“杭漂”
  • 1.Ext JS 建立web开发工程
  • 阿里云服务器购买完整流程
  • ​Java基础复习笔记 第16章:网络编程
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #define
  • #WEB前端(HTML属性)
  • #传输# #传输数据判断#
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (160)时序收敛--->(10)时序收敛十
  • (33)STM32——485实验笔记
  • (7)STL算法之交换赋值
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (十八)SpringBoot之发送QQ邮件
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档