用python中的PyQt库编写一个教务系统,读取excel表导入原始数据并通过加入组件能够对学生成绩数据进行添加、删除、修改、查询
时间: 2023-12-19 08:05:05 浏览: 141
好的,这是一个比较复杂的需求,需要用到PyQt的各种组件和功能,让我们一步步来实现它。
首先,我们需要读取Excel表中的原始数据,可以使用Python中的openpyxl库来实现。代码如下:
```python
import openpyxl
# 打开Excel文件
wb = openpyxl.load_workbook('学生成绩.xlsx')
# 选择工作表
ws = wb.active
# 遍历工作表中的数据
for row in ws.iter_rows(values_only=True):
print(row)
```
接下来,我们需要创建一个PyQt的窗口,并添加组件,如下:
```python
from PyQt5 import QtWidgets, QtCore, QtGui
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
# 设置窗口标题和大小
self.setWindowTitle('教务系统')
self.resize(800, 600)
# 添加表格组件
self.table = QtWidgets.QTableWidget(self)
self.table.setGeometry(QtCore.QRect(10, 10, 780, 480))
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(['学号', '姓名', '成绩', '备注'])
# 添加按钮组件
self.add_btn = QtWidgets.QPushButton('添加', self)
self.add_btn.setGeometry(QtCore.QRect(100, 520, 80, 30))
self.del_btn = QtWidgets.QPushButton('删除', self)
self.del_btn.setGeometry(QtCore.QRect(200, 520, 80, 30))
self.edit_btn = QtWidgets.QPushButton('修改', self)
self.edit_btn.setGeometry(QtCore.QRect(300, 520, 80, 30))
self.query_btn = QtWidgets.QPushButton('查询', self)
self.query_btn.setGeometry(QtCore.QRect(400, 520, 80, 30))
# 绑定按钮事件
self.add_btn.clicked.connect(self.add_data)
self.del_btn.clicked.connect(self.del_data)
self.edit_btn.clicked.connect(self.edit_data)
self.query_btn.clicked.connect(self.query_data)
# 添加数据
def add_data(self):
pass
# 删除数据
def del_data(self):
pass
# 修改数据
def edit_data(self):
pass
# 查询数据
def query_data(self):
pass
```
在窗口中添加了一个表格组件和四个按钮组件,并分别绑定了添加、删除、修改、查询四个事件。但是这些事件的具体实现还没有写,在接下来的代码中我们会完成它们。
接下来,我们需要在添加数据的事件中,读取Excel表中的数据,并将其添加到表格中。代码如下:
```python
# 添加数据
def add_data(self):
# 创建一个文件对话框,选择Excel文件
file_dialog = QtWidgets.QFileDialog(self)
file_dialog.setNameFilter('Excel文件(*.xlsx)')
if file_dialog.exec_():
file_name = file_dialog.selectedFiles()[0]
# 打开Excel文件
wb = openpyxl.load_workbook(file_name)
# 选择工作表
ws = wb.active
# 遍历工作表中的数据,将其添加到表格中
for row_num, row in enumerate(ws.iter_rows(values_only=True)):
self.table.insertRow(row_num)
for col_num, cell_value in enumerate(row):
cell = QtWidgets.QTableWidgetItem(str(cell_value))
self.table.setItem(row_num, col_num, cell)
```
在这个事件中,我们首先创建了一个文件对话框,让用户选择Excel文件。然后打开Excel文件,遍历工作表中的数据,并将其添加到表格中。
接下来,我们需要在删除数据的事件中,删除选中的行数据。代码如下:
```python
# 删除数据
def del_data(self):
# 获取选中的行
selected_rows = self.table.selectionModel().selectedRows()
# 遍历选中的行,删除对应的数据
for row in selected_rows:
row_index = row.row()
self.table.removeRow(row_index)
```
在这个事件中,我们首先获取选中的行,然后遍历选中的行,删除对应的数据。
接下来,我们需要在修改数据的事件中,修改选中的行数据。代码如下:
```python
# 修改数据
def edit_data(self):
# 获取选中的行
selected_rows = self.table.selectionModel().selectedRows()
# 如果选中了多行,则只修改第一行数据
if len(selected_rows) > 0:
row_index = selected_rows[0].row()
row = []
for col_index in range(self.table.columnCount()):
cell_value = self.table.item(row_index, col_index).text()
row.append(cell_value)
# 创建一个对话框,让用户修改数据
dialog = QtWidgets.QDialog(self)
dialog.setWindowTitle('修改数据')
dialog.resize(300, 200)
layout = QtWidgets.QVBoxLayout(dialog)
label1 = QtWidgets.QLabel('学号', dialog)
edit1 = QtWidgets.QLineEdit(row[0], dialog)
layout.addWidget(label1)
layout.addWidget(edit1)
label2 = QtWidgets.QLabel('姓名', dialog)
edit2 = QtWidgets.QLineEdit(row[1], dialog)
layout.addWidget(label2)
layout.addWidget(edit2)
label3 = QtWidgets.QLabel('成绩', dialog)
edit3 = QtWidgets.QLineEdit(row[2], dialog)
layout.addWidget(label3)
layout.addWidget(edit3)
label4 = QtWidgets.QLabel('备注', dialog)
edit4 = QtWidgets.QLineEdit(row[3], dialog)
layout.addWidget(label4)
layout.addWidget(edit4)
ok_btn = QtWidgets.QPushButton('确定', dialog)
ok_btn.clicked.connect(lambda: self.update_data(row_index, edit1.text(), edit2.text(), edit3.text(), edit4.text()))
layout.addWidget(ok_btn)
dialog.exec_()
# 更新数据
def update_data(self, row_index, cell1, cell2, cell3, cell4):
self.table.setItem(row_index, 0, QtWidgets.QTableWidgetItem(cell1))
self.table.setItem(row_index, 1, QtWidgets.QTableWidgetItem(cell2))
self.table.setItem(row_index, 2, QtWidgets.QTableWidgetItem(cell3))
self.table.setItem(row_index, 3, QtWidgets.QTableWidgetItem(cell4))
```
在这个事件中,我们首先获取选中的行,然后从选中的行中获取数据,并创建一个对话框,让用户修改数据。在用户点击确定按钮后,我们调用update_data函数更新数据。
最后,我们需要在查询数据的事件中,根据用户输入的条件查询数据,并显示在表格中。代码如下:
```python
# 查询数据
def query_data(self):
# 创建一个对话框,让用户输入查询条件
dialog = QtWidgets.QDialog(self)
dialog.setWindowTitle('查询数据')
dialog.resize(300, 200)
layout = QtWidgets.QVBoxLayout(dialog)
label1 = QtWidgets.QLabel('学号', dialog)
edit1 = QtWidgets.QLineEdit(dialog)
layout.addWidget(label1)
layout.addWidget(edit1)
label2 = QtWidgets.QLabel('姓名', dialog)
edit2 = QtWidgets.QLineEdit(dialog)
layout.addWidget(label2)
layout.addWidget(edit2)
ok_btn = QtWidgets.QPushButton('确定', dialog)
ok_btn.clicked.connect(lambda: self.do_query(edit1.text(), edit2.text()))
layout.addWidget(ok_btn)
dialog.exec_()
# 执行查询
def do_query(self, student_id, name):
# 遍历表格中的数据,根据条件查询数据
for row_num in range(self.table.rowCount()):
student_id_cell = self.table.item(row_num, 0)
name_cell = self.table.item(row_num, 1)
if student_id and student_id != student_id_cell.text():
self.table.setRowHidden(row_num, True)
elif name and name != name_cell.text():
self.table.setRowHidden(row_num, True)
else:
self.table.setRowHidden(row_num, False)
```
在这个事件中,我们首先创建一个对话框,让用户输入查询条件。在用户点击确定按钮后,我们遍历表格中的数据,根据条件查询数据,并将符合条件的行显示出来,不符合条件的行隐藏起来。
到这里,我们就完成了教务系统的开发。完整的代码如下:
阅读全文