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

python编写的学生信息管理系统(GUI界面+mysql数据库

实现了增删改查和另存(txt的形式)

有需要的可以自行下载

可以先观看教学视频再决定是否下载

注意:输入数据库的用户名和密码就可以直接登录!!!
不需要手动建立数据库和表,由程序自动建立!!!

下载地址:
https://download.csdn.net/download/qq_52889967/19480747

教学视频:
https://v.qq.com/x/page/q3257bz3n3w.html

java实现聊天室:
https://blog.csdn.net/qq_52889967/article/details/118553306

java学生成绩管理系统:
https://blog.csdn.net/qq_52889967/article/details/118581246

运行结果:

用户名和密码为你自己的数据库的用户名和密码!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据库信息:
在这里插入图片描述
注意 :输入数据库的用户名和密码就可以直接运行!!!
不用再自己手动建立数据库和表!!!

本人使用的是MySQL5.7版本的数据库
数据库端口号为:3306
数据库连接名是:root
数据库用户名是:root
数据库名称是:mydatabase
建立的表是:student

在运行代码前请先确定编程软件(本人使用的是pycharm)是否安装PyMySQL

PyMySQL 安装方法

转载:
https://www.runoob.com/python3/python3-mysql.html

部分源码展示:
在这里插入图片描述

from tkinter import *
from tkinter.messagebox import *

from Database import Database


class StudentUI:

    def __init__(self):
        # 数据库的用户名和密码,从self.entry_1和self.entry_2中获得
        self.user = None
        self.password = None
        # # 建立列表用于清除函数的参数传送
        self.list_1 = []
        self.root = Tk()
        self.root.resizable(0, 0)  # 禁止调节大小
        self.screen_width = self.root.winfo_screenwidth()  # 获得屏幕宽度
        self.screen_height = self.root.winfo_screenheight()  # 获得屏幕高度
        # 容器,添加各种组件
        self.frame_1 = Frame(self.root)
        # # 以place的形式添加到root中
        self.frame_1.place(x=0, y=0)
        # 用户名和密码的文本框, show="*",防止密码泄露
        self.entry_1 = Entry(self.frame_1, bd=5)
        self.entry_2 = Entry(self.frame_1, bd=5, show="*")

    # 学生信息管理系统主界面
    def init_1(self):
        # 设置窗口标题
        self.root.title("学生信息管理系统")
        # 设置窗口大小
        self.root.geometry("800x600")
        # self.root.minsize(800, 600)
        # 添加菜单
        menuber = Menu(self.root)
        # tearoff=0是关闭第一行虚线
        menu_1 = Menu(menuber, tearoff=0)
        menuber.add_cascade(label="文件", menu=menu_1)
        menu_2 = Menu(menuber,  tearoff=0)
        menuber.add_cascade(label="功能", menu=menu_2)
        menu_3 = Menu(menuber,  tearoff=0)
        menuber.add_cascade(label="帮助", menu=menu_3)
        # 添加菜单项
        menu_1.add_cascade(label="另存为", command=lambda: Database.savestudent(Database, self.user, self.password))

        menu_2.add_cascade(label="添加学生", command=self.addstudent)
        menu_2.add_cascade(label="删除学生", command=self.deletestudent)
        menu_2.add_cascade(label="修改学生", command=self.updatestudent)
        menu_2.add_cascade(label="查询学生", command=self.selectstudent)
        menu_2.add_cascade(label="输出学生", command=self.showallstudent)

        menu_3.add_cascade(label="关于", command=self.about)
        # 将菜单加入root
        self.root["menu"] = menuber
        # 进入事件循环
        self.root.mainloop()

    # 关于信息
    @staticmethod
    def about():
        showinfo(title="关于", message="en~~~~\n好像没啥可以说的....\n告辞(00)")

    # 登录界面
    def login_1(self):
        self.root.title("登录界面")
        # 设置窗口大小
        self.root.geometry("200x140+%d+%d" % (self.screen_width / 4, self.screen_height / 7))
        # 在root_2中添加登录信息
        label_1 = Label(self.frame_1, text="用户名:")
        label_2 = Label(self.frame_1, text="密码:")
        # label_3为美化界面所用
        label_3 = Label(self.frame_1, text="")
        label_4 = Label(self.frame_1, text="")
        # 以网格布局的形式加入到root_2中
        label_1.grid(row=1, column=0)
        self.entry_1.grid(row=1, column=1)
        label_3.grid(row=2, column=0)
        label_2.grid(row=3, column=0)
        self.entry_2.grid(row=3, column=1)
        label_4.grid(row=4, column=0)
        # 添加用户名和密码的文本框
        self.list_1.append(self.entry_1)
        self.list_1.append(self.entry_2)
        # 添加按钮
        button_1 = Button(self.frame_1, text="登录", command=lambda: self.login_2())
        button_2 = Button(self.frame_1, text="清除", command=lambda: self.clearentry())
        button_1.grid(row=5, column=0)
        button_2.grid(row=5, column=1)

        self.root.mainloop()

    # 添加学生
    def addstudent(self):
        # 清空frame_1的组件,防止组件重叠
        for widget in self.frame_1.winfo_children():
            widget.destroy()
        # 清空list_1
        self.list_1.clear()
        # 在容器frame中添加学生的各种信息
        label_1 = Label(self.frame_1, text="学号:")
        label_2 = Label(self.frame_1, text="姓名:")
        label_3 = Label(self.frame_1, text="性别:")
        label_4 = Label(self.frame_1, text="出生日期:")
        label_5 = Label(self.frame_1, text="电话:")
        label_6 = Label(self.frame_1, text="宿舍号:")
        entry_1 = Entry(self.frame_1, bd=5)
        entry_2 = Entry(self.frame_1, bd=5)
        entry_3 = Entry(self.frame_1, bd=5)
        entry_4 = Entry(self.frame_1, bd=5)
        entry_5 = Entry(self.frame_1, bd=5)
        entry_6 = Entry(self.frame_1, bd=5)

        # 以网格布局的形式加入到frame中
        label_1.grid(row=0, column=0)
        entry_1.grid(row=0, column=1)
        label_2.grid(row=1, column=0)
        entry_2.grid(row=1, column=1)
        label_3.grid(row=2, column=0)
        entry_3.grid(row=2, column=1)
        label_4.grid(row=3, column=0)
        entry_4.grid(row=3, column=1)
        label_5.grid(row=4, column=0)
        entry_5.grid(row=4, column=1)
        label_6.grid(row=5, column=0)
        entry_6.grid(row=5, column=1)
        # 将文本框添加到列表中
        self.list_1.append(entry_1)
        self.list_1.append(entry_2)
        self.list_1.append(entry_3)
        self.list_1.append(entry_4)
        self.list_1.append(entry_5)
        self.list_1.append(entry_6)
        # 添加按钮
        # tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数
        # 若要给函数传递参数,需要在函数前添加lambda:(匿名函数)
        button_1 = Button(self.frame_1, text="提交",
                          command=lambda: Database.addstudent(Database, self.user,
                                                              self.password, entry_1.get(), entry_2.get(),
                                                              entry_3.get(), entry_4.get(), entry_5.get(), entry_6.get()))
        button_2 = Button(self.frame_1, text="清除", command=lambda: self.clearentry())
        button_1.grid(row=6, column=0)
        button_2.grid(row=6, column=1)

    # 输出全部学生
    def showallstudent(self):
        # 清空frame_1的组件,防止组件重叠
        for widget in self.frame_1.winfo_children():
            widget.destroy()
        # 滚动条初始化(scrollBar为垂直滚动条,scrollBarx为水平滚动条)
        scrollBar = Scrollbar(self.frame_1)
        scrollBarx = Scrollbar(self.frame_1, orient=HORIZONTAL)
        # 靠右,充满Y轴
        scrollBar.pack(side=RIGHT, fill=Y)
        # 靠下,充满X轴
        scrollBarx.pack(side=BOTTOM, fill=X)
        lb = Listbox(self.frame_1, width=111, height=32,)
        lb.pack()
        # 而当用户操纵滚动条的时候,自动调用 Treeview 组件的 yview()与xview() 方法
        # 即滚动条与页面内容的位置同步
        scrollBar.config(command=lb.yview)
        scrollBarx.config(command=lb.xview)
        # 调用数据库方法
        Database.showstudent(Database, self.user, self.password, lb)

from tkinter import END

import pymysql
from tkinter.messagebox import *


class Database:
    db = None
    cursor = None

    # 连接数据库
    def condatabase(self, user, password):
        # 打开数据库连接
        try:
            self.db = pymysql.connect(host="localhost", user=user, password=password, database="mydatabase")
            # 使用 cursor() 方法创建一个游标对象 cursor
            self.cursor = self.db.cursor()
            return True
        except:
            return False

    # 加入学生
    def addstudent(self, user, password, sno, sname, sex, birthday, phone, dorm):
        self.condatabase(self, user, password)
        # 检查学号是否重复,是的话函数结束
        if self.determinestudent(self, user, password, sno):
            return
        sql = "insert into student values" \
              "(%s,%s,%s,%s,%s,%s)" % (repr(sno), repr(sname), repr(sex), repr(birthday), repr(phone), repr(dorm))
        try:
            # 使用 execute()  方法执行 SQL,在每次运行sql之前,ping一次,如果连接断开就重连。
            self.db.ping(reconnect=True)
            self.cursor.execute(sql)
            self.db.commit()
            # 消息提示
            showinfo(title="提示界面", message="添加学生信息成功!!!")
        except:
            showerror(title="错误界面", message="数据库异常!!!\n加入失败!!!")
            self.db.rollback()
        # 关闭数据库连接
        self.db.close()

    # 另存学生信息
    def savestudent(self, user, password):
        # 以追加的形式添加
        dataFile = open("D:\\text.txt", "w")
        self.condatabase(self, user, password)
        sql = "select * from student"
        try:
            # 在每次运行sql之前,ping一次,如果连接断开就重连。
            self.db.ping(reconnect=True)
            self.cursor.execute(sql)
            student = self.cursor.fetchall()
            for row in student:
                dataFile.write("学号:" + row[0] + "  姓名:" + row[1] + " 性别:" + row[2] + "  年龄" + row[3] + "  电话:" + row[
                    4] + "  宿舍号:" + row[5]+"\n")
            showinfo(title="提示界面", message="保存学生信息成功!!!\n保存路径如下:\nD:\\\\text.txt")
        except:
            self.db.rollback()
            showerror(title="错误界面", message="保存失败!!!")
        self.db.close()
        dataFile.close()

    # 判断学号重复
    def determinestudent(self, user, password, sno):
        self.condatabase(self, user, password)
        sql = "select * from student where sno = %s" % repr(sno)
        try:
            # 在每次运行sql之前,ping一次,如果连接断开就重连。
            self.db.ping(reconnect=True)
            self.cursor.execute(sql)
            row = self.cursor.fetchone()
            if row is not None:
                showerror(title="错误界面", message="学号重复!!!")
                self.db.rollback()
                return True
        except:
            self.db.rollback()
            return False
        self.db.close()

版权声明:本文为qq_52889967原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。