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版权协议,转载请附上原文出处链接和本声明。