基于python+pyqt5+pymysql写的一个简单的学生信息管理系统

我大学时代学过2年的C++,所以编程上有点底子,所以近期自学Python,Python近几年来能够迅速崛起,与它的语法简单、代码格式简洁有密不可分的关系,如果你有其他语言的基础,学起python来会非常容易上手,就像你会骑自行车,给你辆电动车,你很快就能游刃有余。这篇文章主要是写给初学者交流学习用的,在我编写这个系统过程中,各种功能的实现代码基本来自于csdn各位网友的文章里面,特别感谢的@小小の灰色脑细胞,一个热心快肠的在校小妹妹,她的《pyqt5+pymysql写的一个简易校医室管理系统》给了我很多启示和灵感,而且她还非常热情的给我无私分享了她的源代码,我觉得这才是软件人的格局和高度。
转入正题,写这个系统是因为我工作上需要一个存储数据的系统,具备添加、更改、查询、删除、导出等功能,而且还要与数据库相连接,于是我写这个系统的语言用的是python,为什么?因为它简单好用,系统界面用的是pyqt5,数据库用的是MySql。
第一步:用QtDesigner搭建系统界面框架
用过pyqt5的就知道用它写界面有多方便了,不用你自己去一个个实现按钮、对话框,不用你去计算这些组件的相对位置坐标,你直接用QtDesigner搭建好框架,一键生成框架代码就行了,真的非常好用。再用
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第1张图片
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第2张图片

第二步:新建学生信息数据库,并连接MySql数据库
学生信息数据库,包括学号、姓名、性别、年龄四组信息。关于建数据库CSDN很多文章都写的很清楚,我在这里不再赘述。
下面这段是连接数据库的代码:

    def get_conn(self):
        # 连接数据库
        conn = pymysql.connect(host="127.0.0.1"  # 默认
                               , user="root"  # 用户名
                               , passwd="*******"  # 密码
                               , port=3306  # 端口,默认为3306
                               , db="test"  # 数据库名称
                               , charset="utf8"  # 字符编码
                               )
        return conn
       

第三步:逐一实现数据添加、更改、查询、删除、导出等功能
1、添加学生信息功能
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第3张图片
这个部分主要是要通过对话框将输入的信息储存到数据库中,并实时更新显示在tableWidget中。
将新增学生信息插入到数据库中核心代码如下:

        try:
            # 插入数据的方式,通过字符串传入值
            sql = "insert into student values(%s,%s,%s,%s)"
            cur.execute(sql, (textid, textname, textgender, textage))
            conn.commit()  # 提交更新的数据到数据库
            self.readdatabase()
            self.lineEdit.setText("")
            self.lineEdit_2.setText("")
            # self.lineEdit_3.setText("")
            self.lineEdit_4.setText("")

2.更改学生信息功能
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第4张图片
这一部分是点击某一行学生的信息,能够实时显示在输入框内,再在输入框更改需要更改的信息,再点击更改就能在后台数据库进行更改数据,并能实时在tableWidget上显示。在这里声明一下,学生信息中的学号是唯一标识,不得更改,不然连学号都有一样的就乱套了,也不符合实际情况。
更改数据库中的数据的核心代码如下图所示:

textid = self.lineEdit_5.text()
        textname = self.lineEdit_6.text()
        textgender = self.lineEdit_7.text()
        textage = self.lineEdit_8.text()
        d_row = self.tableWidget_3.currentRow()  # 获取当前选中的行
        d_col = self.tableWidget_3.currentColumn()  # 获取当前选中的列

        id1 = self.tableWidget_3.item(d_row, 0).text()
        # name1 = self.tableWidget_3.item(d_row, 1).text()
        # gender1 = self.tableWidget_3.item(d_row, 2).text()
        # age1 = self.tableWidget_3.item(d_row, 3).text()
        if id1 == textid:
            sql = 'UPDATE student SET name=%s WHERE id = %s;'
            args1 = (textname, textid)
            self.update(sql, args1)
            sql = 'UPDATE student SET gender=%s WHERE id = %s;'
            args2 = (textgender, textid)
            self.update(sql, args2)
            sql = 'UPDATE student SET age=%s WHERE id = %s;'
            args3 = (textage, textid)
            self.update(sql, args3)
            self.readdatabase()
            win32api.MessageBox(0, "更改成功!", "提醒", win32con.MB_ICONASTERISK)
        else:
            win32api.MessageBox(0, "学号是唯一标识无法更改,只能删除新建!", "提醒", win32con.MB_ICONASTERISK)

3.查找学生信息功能
这部分就是分别通过学号、姓名、性别、年龄在数据库中查找符合相关条件的学生。
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第5张图片
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第6张图片
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第7张图片
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第8张图片

查询的核心代码如下:

    def find_stu_id(self):
        str_id = self.lineEdit_9.text()
        try:
            sql = 'SELECT * FROM student WHERE id = {}'.format(str_id)
            self.table_display_id(sql)
            # self.lineEdit_9.setText("")
        except:
            win32api.MessageBox(0, "查无此号,请重新输入!", "提醒", win32con.MB_ICONASTERISK)

    def find_stu_name(self):
        str_name = str(self.lineEdit_10.text())
        try:
            sql = 'SELECT * FROM student WHERE name = "{}"'.format(str_name)
            self.table_display_name(sql)
            # self.lineEdit_10.setText("")
        except:
            win32api.MessageBox(0, "查无此人,请重新输入!", "提醒", win32con.MB_ICONASTERISK)

    def find_stu_gender(self):
        str_gender = self.lineEdit_11.text()
        try:
            sql = 'SELECT * FROM student WHERE gender = "{}"'.format(str_gender)
            self.table_display_gender(sql)
            # self.lineEdit_11.setText("")
        except:
            win32api.MessageBox(0, "无此信息,请重新输入!", "提醒", win32con.MB_ICONASTERISK)

    def find_stu_age(self):
        str_age = self.lineEdit_12.text()
        try:
            sql = 'SELECT * FROM student WHERE age = {}'.format(str_age)
            self.table_display_age(sql)
            # self.lineEdit_12.setText("")
        except:
            win32api.MessageBox(0, "无此信息,请重新输入!", "提醒", win32con.MB_ICONASTERISK)

4.删除学生信息功能
选取一行学生信息,点击删除按钮,即可从数据库中删除该信息。
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第9张图片
删除数据库中的某条信息核心代码如下:

    def delete(self,sql,args):
        conn = self.get_conn()
        cur = conn.cursor()
        result = cur.execute(sql, args)
        print(result)
        conn.commit()
        # self.readdatabase()
        cur.close()
        conn.close()

    def del_stu(self):
        d_row = self.tableWidget_4.currentRow()  # 获取当前选中的行
        id1 = self.tableWidget_4.item(d_row, 0).text()
        sql = 'DELETE FROM student WHERE id = %s;'
        args = (id1,)  # 单个元素的tuple写法
        self.delete(sql, args)
        self.tableWidget_4.clear()  # 刷新数据表
        self.display_4()
        self.readdatabase()  # 重新读取数据库

        self.lineEdit_13.setText("")
        self.lineEdit_14.setText("")
        self.lineEdit_15.setText("")
        self.lineEdit_16.setText("")
    

5.导出学生信息功能
这里分为单条导出、多条导出和全部导出。
基于python+pyqt5+pymysql写的一个简单的学生信息管理系统_第10张图片
核心代码如下图:

#导出单条信息
    def daochu_dant_stu(self):

        d_row = self.tableWidget_5.currentRow()  # 获取当前选中的行
        if d_row != -1 :
            id1 = self.tableWidget_5.item(d_row, 0).text()
            name1 = self.tableWidget_5.item(d_row, 1).text()
            gender1 = self.tableWidget_5.item(d_row, 2).text()
            age1 = self.tableWidget_5.item(d_row, 3).text()
            root = tkinter.Tk()  # 创建一个Tkinter.Tk()实例
            root.withdraw()  # 将Tkinter.Tk()实例隐藏
            file_path = tkinter.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[('Excel files', '.xls')])
            file_path = file_path + ".xls"
            if file_path != ".xls":
                myexcel = xlwt.Workbook(encoding='utf-8')  # 创建myexcel对象
                excelsheet = myexcel.add_sheet('sheet1')  # 创建工作表
                excelsheet.write(0, 0, "学号")  # 写入数据helloworld,0和0 表示第一行和第一列
                excelsheet.write(0, 1, "姓名")  # 写入数据helloworld,0和0 表示第一行和第一列
                excelsheet.write(0, 2,"性别")  # 写入数据helloworld,0和0 表示第一行和第一列
                excelsheet.write(0, 3, "年龄")  # 写入数据helloworld,0和0 表示第一行和第一列
                excelsheet.write(1, 0, id1)  # 写入数据helloworld,0和0 表示第一行和第一列
                excelsheet.write(1, 1, name1)  # 写入数据helloworld,0和0 表示第一行和第一列
                excelsheet.write(1, 2, gender1)  # 写入数据helloworld,0和0 表示第一行和第一列
                excelsheet.write(1, 3, age1)  # 写入数据helloworld,0和0 表示第一行和第一列
                myexcel.save(file_path)  # 保存数据到我的excel.xls中
                win32api.MessageBox(0, "导出成功!", "提醒", win32con.MB_ICONASTERISK)
            else:
                win32api.MessageBox(0, "请先选择保存路径!", "提醒", win32con.MB_ICONASTERISK)
        else:
            win32api.MessageBox(0, "请先选中一行!", "提醒", win32con.MB_ICONASTERISK)
# 导出全部信息
    def daochu_all_stu(self):
        root = tkinter.Tk()  # 创建一个Tkinter.Tk()实例
        root.withdraw()  # 将Tkinter.Tk()实例隐藏

        file_path = tkinter.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[('Excel files', '.xls')])
        file_path = file_path + ".xls"
        print(file_path)

        if file_path != ".xls":
            book = xlwt.Workbook(encoding='utf-8')
            sheet = book.add_sheet('学生信息表')
            sheet.write(0, 0, "序号")  # 写入数据helloworld,0和0 表示第一行和第一列
            sheet.write(0, 1, "学号")  # 写入数据helloworld,0和0 表示第一行和第一列
            sheet.write(0, 2, "姓名")  # 写入数据helloworld,0和0 表示第一行和第一列
            sheet.write(0, 3, "性别")  # 写入数据helloworld,0和0 表示第一行和第一列
            sheet.write(0, 4, "年龄")  # 写入数据helloworld,0和0 表示第一行和第一列
            for i in range(0, self.tableWidget_5.rowCount()):

                sheet.write(i + 1, 0, i + 1)
                for j in range(0, self.tableWidget_5.columnCount()):
                    try:

                        sheet.write(i + 1, j + 1, self.tableWidget_5.item(i, j).text())

                        book.save(file_path)  # 保存数据到我的excel.xls中

                    except:
                        continue
            win32api.MessageBox(0, "导出成功!", "提醒", win32con.MB_ICONASTERISK)
        else:
            win32api.MessageBox(0, "请先选择保存路径!", "提醒", win32con.MB_ICONASTERISK)

文章中的软件作者已用心整理完善好上传到作者最新发表,有需要的可以自行下载,绝对物超所值,能学到很多部件的实现代码和用法,一通百通。

你可能感兴趣的:(Python自学,python,mysql,数据库,pyqt5)