好的,下面是一个简单的学生成绩管理的增删改查功能的代码示例,主要使用了 Python 3、PyQt5 和 pyodbc 模块。
请注意,此代码示例仅供参考,实际使用时需要根据具体需求进行修改。
```python
import sys
import pyodbc
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QTableWidgetItem
from PyQt5.QtCore import Qt
class ScoreManagementSystem(QMainWindow):
def __init__(self):
super().__init__()
# 初始化界面和数据库连接
self.init_ui()
self.init_db()
def init_ui(self):
# 创建界面控件
self.table = QTableWidget(self)
self.add_button = QPushButton("添加", self)
self.delete_button = QPushButton("删除", self)
self.modify_button = QPushButton("修改", self)
self.search_button = QPushButton("查询", self)
# 设置控件位置和大小
self.table.setGeometry(10, 10, 580, 380)
self.add_button.setGeometry(10, 400, 70, 30)
self.delete_button.setGeometry(90, 400, 70, 30)
self.modify_button.setGeometry(170, 400, 70, 30)
self.search_button.setGeometry(250, 400, 70, 30)
# 设置表格列数和列名
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(["学号", "姓名", "课程名", "成绩"])
# 设置界面标题和大小
self.setWindowTitle("学生成绩管理系统")
self.setGeometry(100, 100, 600, 450)
# 绑定按钮点击事件
self.add_button.clicked.connect(self.add_score)
self.delete_button.clicked.connect(self.delete_score)
self.modify_button.clicked.connect(self.modify_score)
self.search_button.clicked.connect(self.search_score)
def init_db(self):
# 连接 SQL Server 数据库
self.conn = pyodbc.connect('DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=scoredb;UID=sa;PWD=123456')
self.cursor = self.conn.cursor()
def add_score(self):
# 打开添加成绩对话框
add_dialog = AddScoreDialog()
if add_dialog.exec_() == QDialog.Accepted:
# 获取添加成绩对话框中的数据
student_id = add_dialog.student_id_edit.text()
student_name = add_dialog.student_name_edit.text()
course_name = add_dialog.course_name_edit.text()
score = add_dialog.score_edit.text()
# 插入数据到数据库中
self.cursor.execute("INSERT INTO scores (student_id, student_name, course_name, score) VALUES (?, ?, ?, ?)",
(student_id, student_name, course_name, score))
self.conn.commit()
# 在表格中显示新添加的数据
row_count = self.table.rowCount()
self.table.insertRow(row_count)
self.table.setItem(row_count, 0, QTableWidgetItem(student_id))
self.table.setItem(row_count, 1, QTableWidgetItem(student_name))
self.table.setItem(row_count, 2, QTableWidgetItem(course_name))
self.table.setItem(row_count, 3, QTableWidgetItem(score))
def delete_score(self):
# 获取选中的行数
selected_rows = self.table.selectionModel().selectedRows()
if len(selected_rows) == 0:
QMessageBox.warning(self, "警告", "请先选中要删除的行!")
return
reply = QMessageBox.question(self, "确认", "确定要删除选中的行吗?", QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
# 从数据库中删除选中的数据
for row in selected_rows:
student_id = self.table.item(row.row(), 0).text()
self.cursor.execute("DELETE FROM scores WHERE student_id=?", (student_id,))
self.conn.commit()
# 从表格中删除选中的行
for row in reversed(selected_rows):
self.table.removeRow(row.row())
def modify_score(self):
# 获取选中的行数
selected_rows = self.table.selectionModel().selectedRows()
if len(selected_rows) != 1:
QMessageBox.warning(self, "警告", "请选择一行要修改的数据!")
return
# 打开修改成绩对话框,并将选中数据显示在对话框中
modify_dialog = ModifyScoreDialog()
modify_dialog.student_id_edit.setText(self.table.item(selected_rows[0].row(), 0).text())
modify_dialog.student_name_edit.setText(self.table.item(selected_rows[0].row(), 1).text())
modify_dialog.course_name_edit.setText(self.table.item(selected_rows[0].row(), 2).text())
modify_dialog.score_edit.setText(self.table.item(selected_rows[0].row(), 3).text())
if modify_dialog.exec_() == QDialog.Accepted:
# 获取修改成绩对话框中的数据
student_id = modify_dialog.student_id_edit.text()
student_name = modify_dialog.student_name_edit.text()
course_name = modify_dialog.course_name_edit.text()
score = modify_dialog.score_edit.text()
# 更新数据库中的数据
self.cursor.execute("UPDATE scores SET student_name=?, course_name=?, score=? WHERE student_id=?",
(student_name, course_name, score, student_id))
self.conn.commit()
# 更新表格中的数据
self.table.setItem(selected_rows[0].row(), 1, QTableWidgetItem(student_name))
self.table.setItem(selected_rows[0].row(), 2, QTableWidgetItem(course_name))
self.table.setItem(selected_rows[0].row(), 3, QTableWidgetItem(score))
def search_score(self):
# 打开查询成绩对话框
search_dialog = SearchScoreDialog()
if search_dialog.exec_() == QDialog.Accepted:
# 获取查询成绩对话框中的数据
student_id = search_dialog.student_id_edit.text()
course_name = search_dialog.course_name_edit.text()
# 查询数据库中的数据
self.cursor.execute("SELECT * FROM scores WHERE student_id=? OR course_name=?", (student_id, course_name))
result = self.cursor.fetchall()
# 在表格中显示查询结果
self.table.setRowCount(0)
for row in result:
row_count = self.table.rowCount()
self.table.insertRow(row_count)
self.table.setItem(row_count, 0, QTableWidgetItem(row[0]))
self.table.setItem(row_count, 1, QTableWidgetItem(row[1]))
self.table.setItem(row_count, 2, QTableWidgetItem(row[2]))
self.table.setItem(row_count, 3, QTableWidgetItem(str(row[3])))
class AddScoreDialog(QDialog):
def __init__(self):
super().__init__()
# 创建添加成绩对话框控件
self.student_id_label = QLabel("学号:", self)
self.student_id_edit = QLineEdit(self)
self.student_name_label = QLabel("姓名:", self)
self.student_name_edit = QLineEdit(self)
self.course_name_label = QLabel("课程名:", self)
self.course_name_edit = QLineEdit(self)
self.score_label = QLabel("成绩:", self)
self.score_edit = QLineEdit(self)
self.ok_button = QPushButton("确定", self)
self.cancel_button = QPushButton("取消", self)
# 设置控件位置和大小
self.student_id_label.setGeometry(10, 10, 60, 20)
self.student_id_edit.setGeometry(80, 10, 100, 20)
self.student_name_label.setGeometry(190, 10, 60, 20)
self.student_name_edit.setGeometry(260, 10, 100, 20)
self.course_name_label.setGeometry(370, 10, 60, 20)
self.course_name_edit.setGeometry(440, 10, 100, 20)
self.score_label.setGeometry(10, 40, 60, 20)
self.score_edit.setGeometry(80, 40, 100, 20)
self.ok_button.setGeometry(100, 80, 70, 30)
self.cancel_button.setGeometry(180, 80, 70, 30)
# 设置对话框标题和大小
self.setWindowTitle("添加成绩")
self.setGeometry(100, 100, 560, 120)
# 绑定按钮点击事件
self.ok_button.clicked.connect(self.accept)
self.cancel_button.clicked.connect(self.reject)
class ModifyScoreDialog(QDialog):
def __init__(self):
super().__init__()
# 创建修改成绩对话框控件
self.student_id_label = QLabel("学号:", self)
self.student_id_edit = QLineEdit(self)
self.student_name_label = QLabel("姓名:", self)
self.student_name_edit = QLineEdit(self)
self.course_name_label = QLabel("课程名:", self)
self.course_name_edit = QLineEdit(self)
self.score_label = QLabel("成绩:", self)
self.score_edit = QLineEdit(self)
self.ok_button = QPushButton("确定", self)
self.cancel_button = QPushButton("取消", self)
# 设置控件位置和大小
self.student_id_label.setGeometry(10, 10, 60, 20)
self.student_id_edit.setGeometry(80, 10, 100, 20)
self.student_name_label.setGeometry(190, 10, 60, 20)
self.student_name_edit.setGeometry(260, 10, 100, 20)
self.course_name_label.setGeometry(370, 10, 60, 20)
self.course_name_edit.setGeometry(440, 10, 100, 20)
self.score_label.setGeometry(10, 40, 60, 20)
self.score_edit.setGeometry(80, 40, 100, 20)
self.ok_button.setGeometry(100, 80, 70, 30)
self.cancel_button.setGeometry(180, 80, 70, 30)
# 设置对话框标题和大小
self.setWindowTitle("修改成绩")
self.setGeometry(100, 100, 560, 120)
# 绑定按钮点击事件
self.ok_button.clicked.connect(self.accept)
self.cancel_button.clicked.connect(self.reject)
class SearchScoreDialog(QDialog):
def __init__(self):
super().__init__()
# 创建查询成绩对话框控件
self.student_id_label = QLabel("学号:", self)
self.student_id_edit = QLineEdit(self)
self.course_name_label = QLabel("课程名:", self)
self.course_name_edit = QLineEdit(self)
self.ok_button = QPushButton("确定", self)
self.cancel_button = QPushButton("取消", self)
# 设置控件位置和大小
self.student_id_label.setGeometry(10, 10, 60, 20)
self.student_id_edit.setGeometry(80, 10, 100, 20)
self.course_name_label.setGeometry(190, 10, 60, 20)
self.course_name_edit.setGeometry(260, 10, 100, 20)
self.ok_button.setGeometry(100, 40, 70, 30)
self.cancel_button.setGeometry(180, 40, 70, 30)
# 设置对话框标题和大小
self.setWindowTitle("查询成绩")
self.setGeometry(100, 100, 380, 80)
# 绑定按钮点击事件
self.ok_button.clicked.connect(self.accept)
self.cancel_button.clicked.connect(self.reject)
# 连接 SQL Server 数据库
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=scoredb;UID=sa;PWD=123456')
cursor = conn.cursor()
# 创建 scores 表格
cursor.execute("IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='scores' AND xtype='U') CREATE TABLE scores (student_id VARCHAR(20) PRIMARY KEY, student_name VARCHAR(50), course_name VARCHAR(50), score FLOAT)")
conn.commit()
# 查询 scores 表格中的数据,并在表格中显示
cursor.execute("SELECT * FROM scores")
result = cursor.fetchall()
app = QApplication(sys.argv)
score_management_system = ScoreManagementSystem()
score_management_system.show()
for row in result:
row_count = score_management_system.table.rowCount()
score_management_system.table.insertRow(row_count)
score_management_system.table.setItem(row_count, 0, QTableWidgetItem(row[0]))
score_management_system.table.setItem(row_count, 1, QTableWidgetItem(row[1]))
score_management_system.table.setItem(row_count, 2, QTableWidgetItem(row[2]))
score_management_system.table.setItem(row_count, 3, QTableWidgetItem(str(row[3])))
sys.exit(app.exec_())
```
在运行此代码之前,需要先将 SQL Server 中的数据库和表格创建好,并将连接字符串中的服务器地址、数据库名称、用户名和密码修改为实际值。