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

news2024/11/14 3:55:33

吐槽一下 

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

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

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

可视化展示

登录

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

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

编辑操作

 

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

查询操作

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

按学号查询

按姓名查询

按性别查询

按年龄查询

 按专业查询

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

按照班级查询

 

 代码

main文件

from GUI import GUI

if __name__ == '__main__':
    gui = GUI()
    gui.get_in()

GUI文件

import PySimpleGUI as sg
from LoginDatabase import LoginDatabase
from Editor import Editor
from Find import Find

sg.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:
                break
            if 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, '退出'):
                break
            if 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('这是真的退出了')
                break
        window.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:
                break
            if event == '-exit-':
                break
            if 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('添加成功')
        window.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:
                break
            if 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:
                        break
                    if 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:
                        break
                    if 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:
                        break
                    if 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:
                        break
                    if 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:
                        break
                    if 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:
                        break
                    if 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:
                break
            if event == '确认':
                self.editor.delete_student(int(values['id']))
                sg.popup_auto_close('删除成功')
            if event == '取消':
                break
        window.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:
                break
            if 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:
                        break
                    if 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('更新成功')
                    break
                window_change.close()
            if event == '取消':
                break
            window.close()

DatabaseConnect文件

import pymysql
import json


class 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('数据库连接成功')
            # 返回db
            return db
        except pymysql.Error as e:
            print('数据库连接失败' + str(e))

LoginDatabase文件

from DatabaseConnect import DatabaseConnect


class LoginDatabase(object):
    def __init__(self):
        # 创建database_connect()类的对象
        self.db_connect = DatabaseConnect()
        # 给self.db赋值为db
        self.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 LoginDatabase


class 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, classroom, major, 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

    # 访问id
    def find_id(self, student_id):
        cur = self.db.cursor()
        sql = 'select name,gender,classroom,age,major from students where id=%s ' % student_id
        cur.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' % age
        cur.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

结尾

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

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

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

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

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

相关文章

Java延迟任务

什么是延迟任务 我们把需要延迟执行的任务叫做延迟任务,比如业务中用户发送审配,过期后需要执行一些操作,网上订单未支付,红包过期取消等等。 Java API 实现延迟任务 ScheduledExecutorService实现延迟任务 public static voi…

Charles证书的设置抓HTTPS数据包

文章目录 1.安装软件2.安装证书3.配置SSL Proxying Settings4.配置Proxy Settings5.配置浏览器流量走代理模式6.抓包效果 每次换新工作都会重新安装/配置一次Charles抓包工具,每次都要倒腾很久,配置流程不复杂,就是时间一久容易忘记&#xff…

下发预警处理通知,记录处理意见;错误预警修正的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用…

海康威视 Vision Master 深度学习模块

Vision Master 深度学习模块 1. 图像分割2. 字符训练3. 目标检测4. 图像分类、图像检索 1. 图像分割 2. 字符训练 3. 目标检测 4. 图像分类、图像检索

Zilliz Cloud✖️ Ivy.ai:构建 GenAI 驱动的聊天业务

“可靠性、可扩展性和性能都很棒。而且我们可以外包所有这些管理工作,不必担心服务器故障,这有助于我们将资源投入到产品开发和创新上,这真正使得我们的业务与众不同。” ——Michal Oglodek, Ivy.ai CTO 关于Ivy.ai Ivy.ai&am…

AI剪辑短视频以及账号管理矩阵工具系统搭建开发

目录 前言 一、系统有哪些功能? 二、怎么开发 前言 通过AI剪辑短视频以及生成短视频,以及对自媒体账号的管理功能的功能进行开发。这款系统能够批量混合剪辑视频然后一键发布到绑定好的自媒体账号里面。 一、系统有哪些功能? 1.AI智能文…

Django中的超级管理员相关操作

超级管理员操作 场景描述添加超级管理员删除超级管理员更改超级管理员名称 场景描述 在进行管理员操作的时候,密码忘记,导致超级管理员无法使用,因此网上搜索相关操作,进行总结记录 相关操作都是在控制台完成 Terminal 添加超级管…

【Vulnhub靶机tomato渗透】

第一步:端口扫描 我使用的是webrobot 访问这个ip,就是它了 第二步:目录扫描 打开kali使用dirb命令扫描http://192.168.189.154下的目录 dirb http://192.168.189.154扫描到目录。 第三步:访问目录地址 看到有几个php的文件 第…

计算机组成原理--计算机系统概论

目的 将了解计算机的组成、工作原理及应用,掌握各组成部分之间的联系,包括总线、存储器、输入输出系统以及CPU的内部结构和功能。将对计算机体系结构有较好的理解,并具备一定的问题分析和解决能力。 第1章 绪论 计算机的分类计算机的发展简…

在Linux命令行中检查固件版本的7种方法

当前有几种方法可以检查 Linux上的固件或 BIOS 版本,这有助于解决硬件问题,对于保持系统安全和最新至关重要。 在本文中,我们将了解获取系统固件版本的工具和命令,这些固件版本与 BIOS、UEFI 或设备特定的固件有关。每种方法都提…

重生奇迹MU 三位公认的全能职业

今天我们来讨论游戏中公认的三个全能职业,看看它们中的哪一个更值得被称为“全能”。 魔武双修的魔剑士 魔剑士是游戏中最古老也是最受欢迎的特殊职业之一。一个重要的原因是它独特的魔武双修玩法,玩家们喜欢它。魔剑士不仅可以像剑士一样手持双刃&…

【leetcode中】螺旋矩阵2

1.题目描述 . - 力扣(LeetCode) 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,…

Java_微服务

首先介绍一下单体架构与微服务架构: 单体架构: 微服务: SpringCloud: 版本: 标黑部分为目前企业使用最多的版本,因为它支持jdk8、jdk11,下面使用SpringCloud也会使用这个版本。 服务拆分&…

springboot校园商店配送系统-计算机毕业设计源码68448

摘要 本文详细阐述了基于Spring Boot框架的校园商店配送系统的设计与实现过程。该系统针对校园内的用户需求,整合了用户注册与登录、商品浏览与购买、订单管理、配送追踪、用户反馈收集以及后台管理等功能,为校园内的普通用户、商家、配送员和管理员提供…

今年考研报名时间确定了!(内涵西电考研报名流程)

虽然初试时间还没有得到正式官宣,但是再过1个多月,考研人们最近的一件大事——预报名就要来啦! ⏰预报名时间 9月24日至9月27日,每天9:00—22:00; ⏰正式报名时间 10月8日至10月25日,每天9:00—22:00。 …

数据开发/数仓工程师上手指南(五)CDM-DIM层搭建规范及流程

前言 在上篇文章的进度和基础之上,我们已经算是构建好了ODS数据引入层,ODS这一层构建的比较简单,没有很多限制规范,但是CDM数据公共层可以算得上是数据仓库的主题,之前我们也将DWD数据明细层、DIM数据维度层和DWS公共…

【C++标准库】模拟实现string类(深浅拷贝问题)

模拟实现string类 一.命名空间与类成员变量二.构造函数1.无参(默认)构造2.有参构造3.兼容无参和有参构造4.拷贝构造1.传统写法2.现代写法 三.析构函数四.string类对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 五.string类对象的访问及…

Redis学习[4] ——Redis集群

五、Redis 集群 5.1 什么是Redis集群? 如何提供一个高可用的Redis服务? —— 构建Redis集群 单服务器Redis由于数据都是存储在一台服务器,如果这台服务器出现宕机或者故障,可能会导致服务不可用甚至数据丢失。 要避免这种单点…

C#使用NPOI进行Excel和Word文件处理(一)

文章目录 前言文件大小性能NPOI 的优势示例代码性能优化建议总结Github 地址链接导出效果 前言 NPOI 是一个非常流行的用于在 .NET 环境中操作 Office 文件(包括 Excel 文件)的开源库。它的功能非常强大,但性能和文件大小问题可能因具体的使…

“八股文”面试题:是招聘程序员的金科玉律?

引言 随着互联网的发展,现代企业对程序员的需求日益增加。在招聘过程中,许多公司采用了“八股文”式的面试题目来筛选候选人。这些题目往往涵盖了算法、数据结构、系统设计等方面的基础知识。然而,对于“八股文”在实际工作中的作用&#xf…