我大学时代学过2年的C++,所以编程上有点底子,所以近期自学Python,Python近几年来能够迅速崛起,与它的语法简单、代码格式简洁有密不可分的关系,如果你有其他语言的基础,学起python来会非常容易上手,就像你会骑自行车,给你辆电动车,你很快就能游刃有余。这篇文章主要是写给初学者交流学习用的,在我编写这个系统过程中,各种功能的实现代码基本来自于csdn各位网友的文章里面,特别感谢的@小小の灰色脑细胞,一个热心快肠的在校小妹妹,她的《pyqt5+pymysql写的一个简易校医室管理系统》给了我很多启示和灵感,而且她还非常热情的给我无私分享了她的源代码,我觉得这才是软件人的格局和高度。
转入正题,写这个系统是因为我工作上需要一个存储数据的系统,具备添加、更改、查询、删除、导出等功能,而且还要与数据库相连接,于是我写这个系统的语言用的是python,为什么?因为它简单好用,系统界面用的是pyqt5,数据库用的是MySql。
第一步:用QtDesigner搭建系统界面框架
用过pyqt5的就知道用它写界面有多方便了,不用你自己去一个个实现按钮、对话框,不用你去计算这些组件的相对位置坐标,你直接用QtDesigner搭建好框架,一键生成框架代码就行了,真的非常好用。再用
第二步:新建学生信息数据库,并连接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、添加学生信息功能
这个部分主要是要通过对话框将输入的信息储存到数据库中,并实时更新显示在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.更改学生信息功能
这一部分是点击某一行学生的信息,能够实时显示在输入框内,再在输入框更改需要更改的信息,再点击更改就能在后台数据库进行更改数据,并能实时在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.查找学生信息功能
这部分就是分别通过学号、姓名、性别、年龄在数据库中查找符合相关条件的学生。
查询的核心代码如下:
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.删除学生信息功能
选取一行学生信息,点击删除按钮,即可从数据库中删除该信息。
删除数据库中的某条信息核心代码如下:
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.导出学生信息功能
这里分为单条导出、多条导出和全部导出。
核心代码如下图:
#导出单条信息
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)
文章中的软件作者已用心整理完善好上传到作者最新发表,有需要的可以自行下载,绝对物超所值,能学到很多部件的实现代码和用法,一通百通。