登录/注册

pyqt

更多

PyQt中文示例:学生信息管理系统

下面是一个使用PyQt5实现的中文学生信息管理系统界面。这个应用程序展示了如何创建中文界面、处理中文数据以及实现基本的数据管理功能。

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, 
                            QLabel, QLineEdit, QPushButton, QTableWidget, QTableWidgetItem,
                            QHeaderView, QMessageBox, QComboBox, QFormLayout, QGroupBox)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, QColor

class StudentManagementSystem(QMainWindow):
    def __init__(self):
        super().__init__()

        # 初始化学生数据
        self.students = [
            {"学号": "S001", "姓名": "张三", "性别": "男", "年龄": 20, "专业": "计算机科学", "成绩": 92.5},
            {"学号": "S002", "姓名": "李四", "性别": "女", "年龄": 21, "专业": "软件工程", "成绩": 85.0},
            {"学号": "S003", "姓名": "王五", "性别": "男", "年龄": 19, "专业": "人工智能", "成绩": 78.5}
        ]

        # 设置主窗口
        self.setWindowTitle("学生信息管理系统")
        self.setGeometry(300, 200, 1000, 600)

        # 设置全局字体 - 支持中文显示
        font = QFont("Microsoft YaHei UI", 10)
        QApplication.setFont(font)

        # 创建主布局
        main_widget = QWidget()
        main_layout = QHBoxLayout()
        main_widget.setLayout(main_layout)
        self.setCentralWidget(main_widget)

        # 左侧表单区域
        form_group = QGroupBox("学生信息")
        form_layout = QFormLayout()
        form_group.setLayout(form_layout)
        form_group.setFixedWidth(300)

        # 创建表单控件
        self.student_id = QLineEdit()
        self.student_name = QLineEdit()
        self.student_gender = QComboBox()
        self.student_gender.addItems(["男", "女"])
        self.student_age = QLineEdit()
        self.student_major = QComboBox()
        self.student_major.addItems(["计算机科学", "软件工程", "人工智能", "数据科学", "网络安全"])
        self.student_grade = QLineEdit()

        # 添加到表单布局
        form_layout.addRow("学号:", self.student_id)
        form_layout.addRow("姓名:", self.student_name)
        form_layout.addRow("性别:", self.student_gender)
        form_layout.addRow("年龄:", self.student_age)
        form_layout.addRow("专业:", self.student_major)
        form_layout.addRow("成绩:", self.student_grade)

        # 按钮区域
        button_layout = QHBoxLayout()
        self.add_btn = QPushButton("添加学生")
        self.update_btn = QPushButton("更新信息")
        self.delete_btn = QPushButton("删除学生")
        self.clear_btn = QPushButton("清空表单")

        button_layout.addWidget(self.add_btn)
        button_layout.addWidget(self.update_btn)
        button_layout.addWidget(self.delete_btn)
        button_layout.addWidget(self.clear_btn)

        # 右侧表格区域
        self.table = QTableWidget()
        self.table.setColumnCount(6)
        self.table.setHorizontalHeaderLabels(["学号", "姓名", "性别", "年龄", "专业", "成绩"])
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.table.setSelectionBehavior(QTableWidget.SelectRows)

        # 将表单和按钮添加到左侧垂直布局
        left_layout = QVBoxLayout()
        left_layout.addWidget(form_group)
        left_layout.addLayout(button_layout)
        left_layout.addStretch()

        # 将左侧和表格添加到主布局
        main_layout.addLayout(left_layout)
        main_layout.addWidget(self.table)

        # 连接信号与槽
        self.add_btn.clicked.connect(self.add_student)
        self.update_btn.clicked.connect(self.update_student)
        self.delete_btn.clicked.connect(self.delete_student)
        self.clear_btn.clicked.connect(self.clear_form)
        self.table.itemSelectionChanged.connect(self.load_selected_student)

        # 初始化表格数据
        self.load_students_to_table()

        # 设置样式
        self.setStyleSheet("""
            QMainWindow {
                background-color: #f0f2f5;
            }
            QGroupBox {
                border: 1px solid #dcdfe6;
                border-radius: 5px;
                margin-top: 1ex;
                font-weight: bold;
                background-color: white;
            }
            QGroupBox::title {
                subcontrol-origin: margin;
                left: 10px;
                padding: 0 5px;
            }
            QTableWidget {
                background-color: white;
                border: 1px solid #dcdfe6;
                border-radius: 5px;
                gridline-color: #ebeef5;
                font-size: 12px;
            }
            QHeaderView::section {
                background-color: #f5f7fa;
                padding: 6px;
                border: 1px solid #dcdfe6;
                font-weight: bold;
            }
            QPushButton {
                background-color: #409eff;
                color: white;
                border: none;
                border-radius: 4px;
                padding: 8px 15px;
            }
            QPushButton:hover {
                background-color: #66b1ff;
            }
            QPushButton:pressed {
                background-color: #3a8ee6;
            }
            QLineEdit, QComboBox {
                border: 1px solid #dcdfe6;
                border-radius: 4px;
                padding: 5px;
            }
        """)

    def load_students_to_table(self):
        """加载学生数据到表格"""
        self.table.setRowCount(len(self.students))
        for i, student in enumerate(self.students):
            self.table.setItem(i, 0, QTableWidgetItem(student["学号"]))
            self.table.setItem(i, 1, QTableWidgetItem(student["姓名"]))
            self.table.setItem(i, 2, QTableWidgetItem(student["性别"]))
            self.table.setItem(i, 3, QTableWidgetItem(str(student["年龄"])))
            self.table.setItem(i, 4, QTableWidgetItem(student["专业"]))

            # 设置成绩项,根据成绩设置颜色
            grade = student["成绩"]
            grade_item = QTableWidgetItem(str(grade))
            if grade >= 90:
                grade_item.setForeground(QColor(0, 200, 0))  # 绿色
            elif grade < 60:
                grade_item.setForeground(QColor(255, 0, 0))  # 红色
            self.table.setItem(i, 5, grade_item)

    def load_selected_student(self):
        """将选中的学生信息加载到表单"""
        selected_row = self.table.currentRow()
        if selected_row >= 0:
            student = self.students[selected_row]
            self.student_id.setText(student["学号"])
            self.student_name.setText(student["姓名"])
            self.student_gender.setCurrentText(student["性别"])
            self.student_age.setText(str(student["年龄"]))
            self.student_major.setCurrentText(student["专业"])
            self.student_grade.setText(str(student["成绩"]))

    def validate_form(self):
        """验证表单输入是否有效"""
        if not all([
            self.student_id.text().strip(),
            self.student_name.text().strip(),
            self.student_age.text().strip(),
            self.student_grade.text().strip()
        ]):
            QMessageBox.warning(self, "输入错误", "所有字段都必须填写!")
            return False

        try:
            age = int(self.student_age.text())
            grade = float(self.student_grade.text())
            if age <= 0 or age > 150:
                QMessageBox.warning(self, "输入错误", "年龄必须在1-150之间!")
                return False
            if grade < 0 or grade > 100:
                QMessageBox.warning(self, "输入错误", "成绩必须在0-100之间!")
                return False
        except ValueError:
            QMessageBox.warning(self, "输入错误", "年龄必须是整数,成绩必须是数字!")
            return False

        return True

    def add_student(self):
        """添加新学生"""
        if not self.validate_form():
            return

        # 检查学号是否重复
        student_id = self.student_id.text().strip()
        if any(s["学号"] == student_id for s in self.students):
            QMessageBox.warning(self, "添加失败", "该学号已存在!")
            return

        # 创建新学生
        student = {
            "学号": student_id,
            "姓名": self.student_name.text().strip(),
            "性别": self.student_gender.currentText(),
            "年龄": int(self.student_age.text()),
            "专业": self.student_major.currentText(),
            "成绩": float(self.student_grade.text())
        }

        self.students.append(student)
        self.load_students_to_table()
        self.clear_form()
        QMessageBox.information(self, "添加成功", "学生信息添加成功!")

    def update_student(self):
        """更新学生信息"""
        if not self.validate_form() or not self.table.currentItem():
            return

        selected_row = self.table.currentRow()
        if selected_row < 0:
            QMessageBox.warning(self, "更新失败", "请先选择一个学生!")
            return

        student_id = self.student_id.text().strip()

        # 检查学号是否被修改为已存在的学号
        if student_id != self.students[selected_row]["学号"]:
            if any(s["学号"] == student_id for s in self.students):
                QMessageBox.warning(self, "更新失败", "该学号已存在!")
                return

        # 更新学生信息
        self.students[selected_row] = {
            "学号": student_id,
            "姓名": self.student_name.text().strip(),
            "性别": self.student_gender.currentText(),
            "年龄": int(self.student_age.text()),
            "专业": self.student_major.currentText(),
            "成绩": float(self.student_grade.text())
        }

        self.load_students_to_table()
        QMessageBox.information(self, "更新成功", "学生信息更新成功!")

    def delete_student(self):
        """删除学生"""
        selected_row = self.table.currentRow()
        if selected_row < 0:
            QMessageBox.warning(self, "删除失败", "请先选择一个学生!")
            return

        reply = QMessageBox.question(self, "确认删除", 
                                     "确定要删除选中的学生吗?", 
                                     QMessageBox.Yes | QMessageBox.No)
        if reply == QMessageBox.Yes:
            self.students.pop(selected_row)
            self.load_students_to_table()
            self.clear_form()

    def clear_form(self):
        """清空表单"""
        self.student_id.clear()
        self.student_name.clear()
        self.student_gender.setCurrentIndex(0)
        self.student_age.clear()
        self.student_major.setCurrentIndex(0)
        self.student_grade.clear()
        self.table.clearSelection()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    # 设置中文字体支持
    app.setFont(QFont("Microsoft YaHei UI", 10))
    window = StudentManagementSystem()
    window.show()
    sys.exit(app.exec_())

功能说明

这个学生信息管理系统实现了以下功能:

  1. 数据展示:使用表格展示所有学生信息
  2. 数据操作
    • 添加新学生
    • 修改选中学生的信息
    • 删除选中学生
    • 清空表单
  3. 数据验证
    • 验证必填字段是否为空
    • 验证年龄和成绩是否为有效数字
    • 验证学号是否重复

界面特点

  1. 中文界面:所有界面元素都使用中文
  2. 响应式设计:左侧为表单区域,右侧为数据表格
  3. 视觉美化
    • 使用CSS样式美化界面
    • 表格行根据成绩高低显示不同颜色
    • 按钮有悬停和点击效果
  4. 用户体验
    • 选中表格行时自动加载数据到表单
    • 操作有确认提示
    • 输入错误时显示友好提示

使用说明

  1. 填写表单信息后点击"添加学生"添加新记录
  2. 点击表格中的某一行,该行数据会加载到表单中
  3. 修改表单内容后点击"更新信息"保存修改
  4. 选中某行后点击"删除学生"可删除该记录
  5. 点击"清空表单"可清除所有输入内容并取消选择

要运行此程序,您需要安装PyQt5:

pip install pyqt5

PYQT 应用程序框架及开发工具

大家好,本团队此次分享的内容为开发过程中使用到的PYQT 应用程序框架及开发工具。 pYqt 是一个多平台的 python 图形用户界面应用程序框架,由于其面向对象、 易扩展(可实现组件编程等

2025-10-29 07:15:46

使用PyQt5自动初始化OpenVINO™环境出现报错怎么解决?

编写了一个程序以使用 PyQt5 自动初始化OpenVINO™环境:从 PyQt5 导入 QtWidgets 导入操作系统 #import时间 导入系统 如果__name__

2025-03-07 06:35:02

基于PyQT5与ONNXRUNTIME实现风格迁移应用

2023年一月份跟二月份创建了一个PyQT5人工智能软件开发系列的文章系列,过去的两个月都没怎么更新,心里一直想有时间继续更新下去,今天又更新了一篇,基于PyQT5实现多线程、界面化、风格迁移模型的实时推理。

2023-10-25 10:35:54

PYQT5自动化上位机开发记录

记录使用PYQT5快速开发生产工具使用python开发用于wafer切割系统控制部分 文章简介 项目简介 控制框图 DEMO展示 基础环境搭建 因其他原因停止更新使用python开发用于wafer

资料下载 李玉鑫 2023-05-11 18:25:43

PyQT开发上位机教程

,两个都需要安装,需要记住安装的位置,一会儿需要设置环境变量。 pip install PyQt5pip install PyQt5 - tools ( DemoProject )E : \WorkSp

资料下载 卓侨汉 2023-05-08 09:59:15

notepad-pyqt5 PyQt记事本

./oschina_soft/gitee-notepad-pyqt5.zip

资料下载 贾永世 2022-05-24 09:20:14

MAC-OS-X-下用py2app打包PYQT程序

MAC-OS-X-下用py2app打包PYQT程序(茂硕电源技术参数)-该文档为MAC-OS-X-下用py2app打包PYQT程序讲解教程,是份不错的参考资料,感兴趣的可以下载看看,,,,,,,,,,,,,,,,,,

资料下载 479809 2021-09-24 15:33:02

PyQt5的中文教程电子书免费下载

 本教程的目的是带领你入门PyQt5。教程内所有代码都在Linux上测试通过。PyQt4 教程是PyQt4的教程,

资料下载 林培阳 2020-08-06 08:00:00

鲁班猫0 ubuntu20 解决python3.10安装pyqt5

前面用pip install pyqt5,总是安装不成功。经查阅资料,最后用:udo apt install python3-pyqt5成功安装cat@lubancat:~&#036

2023-04-09 11:04:43

OpenCV+PyQT5开发桌面应用几个重要的坑与解决

大概去年八月份的时候,我打算用OpenCV+PyQT5开发一套OpenCV教学演示与快速验证桌面软件,说实话那个时候我对PyQT5的理解就是Hello World水平。经过一年多开发锤炼,不断实践

2022-12-13 11:55:42

ROC-RK3588S-PC_Ubuntu20.04固件使用pyqt5异常是何原因

问题描述及复现步骤:使用sudo apt install python3-pyqt5* -y安装完毕后,引用QtGui的时候报错了有碰到同款错误的吗?你们怎么解决的?

2022-11-02 16:14:39

PyQT5+OpenCV开发的应用如何打包发布?

我自己用PyQT5写了一个应用程序,基本上都写好了,到了打包发布这个环节,我知道的有两个工具可以帮我打包分别是。

2022-10-25 09:40:34

PyQT多线程正确的调用方式

我这两天一直想把YOLOv5上加个训练的界面,把控制台的输出重定向到一个PyQT5写的界面上,然后我很顺序的写好了一个简单的测试,发现可以重定向了,一直实时获取输出了。

2022-08-29 10:24:10

如何使用Python配合PyQT5模块来开发图形化应用程序

By Toradex秦海1).简介随着Python在互联网人工智能领域的流行,大家也慢慢感受到Python开发的便利,本文就基于嵌入式ARM平台,介绍使用Python配合PyQT5模块来开发图形化

2021-12-24 06:41:29

利用PyQt5编辑软件界面的简单步骤

的操作以及利用PyQt5编辑软件界面的简单步骤。实现难度不大,但需要运行第二线程运行输出脉冲的程序。 首先,推荐一下PyQt5和Eric6的学习资料...

2021-09-16 07:48:53
7天热门专题 换一换
相关标签