使用豆包ai设计了一个教师生涯管理系统的看板,大佬能用py编译成可以操作的exe文件...

查看 18|回复 2
作者:Ant爱上猫   
我想设计一款,适用于小学教师的教师生涯管理系统,可以根据年份设置春季、秋季学期,有详情页里面可以根据学期,输入学生姓名等信息,以及本学期的课程表,还有根据日期生成本学期参加的教研活动、评比比赛等活动日程。豆包ai给我生成的数据看板界面我觉得挺符合我的要求[i]
有没有大佬可以编译成可执行软件呀,软件本地运行即可。ai给了编程的代码,没看懂也没弄出来
[Python] 纯文本查看 复制代码import sys
import os
import sqlite3
from datetime import datetime
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout,
                            QHBoxLayout, QPushButton, QLabel, QLineEdit, QTextEdit,
                            QDateEdit, QComboBox, QListWidget, QFileDialog, QMessageBox,
                            QTableWidget, QTableWidgetItem, QHeaderView, QFormLayout,
                            QGroupBox, QRadioButton, QButtonGroup, QSplitter, QListWidgetItem)
from PyQt5.QtCore import Qt, QDate
from PyQt5.QtGui import QPixmap, QIcon
class TeacherManagementSystem(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("教师生涯管理系统")
        self.setGeometry(100, 100, 1200, 800)
        
        # 初始化数据库
        self.init_database()
        
        # 创建主界面
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.main_layout = QVBoxLayout(self.central_widget)
        
        # 创建标签页
        self.tabs = QTabWidget()
        
        # 添加各个功能模块
        self.setup_semester_tab()
        self.setup_student_tab()
        self.setup_timetable_tab()
        self.setup_activity_tab()
        
        self.main_layout.addWidget(self.tabs)
        
        # 加载数据
        self.load_semesters()
        self.load_students()
        self.load_timetables()
        self.load_activities()
   
    def init_database(self):
        """初始化SQLite数据库"""
        self.conn = sqlite3.connect('teacher_management.db')
        self.cursor = self.conn.cursor()
        
        # 创建学期表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS semesters (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            year TEXT NOT NULL,
            term TEXT NOT NULL,
            start_date TEXT NOT NULL,
            end_date TEXT NOT NULL
        )
        ''')
        
        # 创建学生表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS students (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            gender TEXT NOT NULL,
            birth_date TEXT NOT NULL,
            id_number TEXT,
            address TEXT,
            photo BLOB,
            parent1_name TEXT,
            parent1_phone TEXT,
            parent2_name TEXT,
            parent2_phone TEXT,
            grandparent1_name TEXT,
            grandparent1_phone TEXT,
            grandparent2_name TEXT,
            grandparent2_phone TEXT,
            grandparent3_name TEXT,
            grandparent3_phone TEXT,
            grandparent4_name TEXT,
            grandparent4_phone TEXT,
            semester_id INTEGER,
            FOREIGN KEY (semester_id) REFERENCES semesters (id)
        )
        ''')
        
        # 创建课程表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS timetables (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            day_of_week INTEGER NOT NULL,
            period INTEGER NOT NULL,
            course_name TEXT NOT NULL,
            class_name TEXT NOT NULL,
            location TEXT,
            semester_id INTEGER,
            FOREIGN KEY (semester_id) REFERENCES semesters (id)
        )
        ''')
        
        # 创建活动表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS activities (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            type TEXT NOT NULL,
            date TEXT NOT NULL,
            time TEXT NOT NULL,
            duration TEXT,
            description TEXT,
            attachments TEXT,
            semester_id INTEGER,
            FOREIGN KEY (semester_id) REFERENCES semesters (id)
        )
        ''')
        
        self.conn.commit()
   
    def setup_semester_tab(self):
        """设置学期管理标签页"""
        self.semester_tab = QWidget()
        self.semester_layout = QVBoxLayout(self.semester_tab)
        
        # 学期列表
        self.semester_list = QTableWidget()
        self.semester_list.setColumnCount(5)
        self.semester_list.setHorizontalHeaderLabels(["ID", "学年", "学期", "开始日期", "结束日期"])
        self.semester_list.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.semester_list.setEditTriggers(QTableWidget.NoEditTriggers)
        self.semester_list.setSelectionBehavior(QTableWidget.SelectRows)
        
        # 按钮区域
        self.semester_button_layout = QHBoxLayout()
        self.add_semester_btn = QPushButton("添加学期")
        self.add_semester_btn.clicked.connect(self.add_semester)
        self.edit_semester_btn = QPushButton("编辑学期")
        self.edit_semester_btn.clicked.connect(self.edit_semester)
        self.delete_semester_btn = QPushButton("删除学期")
        self.delete_semester_btn.clicked.connect(self.delete_semester)
        
        self.semester_button_layout.addWidget(self.add_semester_btn)
        self.semester_button_layout.addWidget(self.edit_semester_btn)
        self.semester_button_layout.addWidget(self.delete_semester_btn)
        
        self.semester_layout.addWidget(self.semester_list)
        self.semester_layout.addLayout(self.semester_button_layout)
        
        self.tabs.addTab(self.semester_tab, "学期管理")
   
    def setup_student_tab(self):
        """设置学生管理标签页"""
        self.student_tab = QWidget()
        self.student_layout = QHBoxLayout(self.student_tab)
        
        # 左侧学生列表
        self.student_list = QListWidget()
        self.student_list.itemClicked.connect(self.load_student_details)
        
        # 右侧学生详情
        self.student_details = QWidget()
        self.student_details_layout = QVBoxLayout(self.student_details)
        
        # 基本信息
        self.basic_info_group = QGroupBox("学生基本信息")
        self.basic_info_layout = QFormLayout()
        
        self.student_name = QLineEdit()
        self.student_gender_male = QRadioButton("男")
        self.student_gender_female = QRadioButton("女")
        self.gender_group = QButtonGroup()
        self.gender_group.addButton(self.student_gender_male)
        self.gender_group.addButton(self.student_gender_female)
        self.gender_layout = QHBoxLayout()
        self.gender_layout.addWidget(self.student_gender_male)
        self.gender_layout.addWidget(self.student_gender_female)
        
        self.student_birth_date = QDateEdit()
        self.student_birth_date.setCalendarPopup(True)
        self.student_id_number = QLineEdit()
        self.student_address = QLineEdit()
        
        self.basic_info_layout.addRow("姓名:", self.student_name)
        self.basic_info_layout.addRow("性别:", self.gender_layout)
        self.basic_info_layout.addRow("出生日期:", self.student_birth_date)
        self.basic_info_layout.addRow("身份证号:", self.student_id_number)
        self.basic_info_layout.addRow("家庭住址:", self.student_address)
        
        self.basic_info_group.setLayout(self.basic_info_layout)
        
        # 家庭成员信息
        self.family_info_group = QGroupBox("家庭成员信息")
        self.family_info_layout = QFormLayout()
        
        self.parent1_name = QLineEdit()
        self.parent1_phone = QLineEdit()
        self.parent2_name = QLineEdit()
        self.parent2_phone = QLineEdit()
        self.grandparent1_name = QLineEdit()
        self.grandparent1_phone = QLineEdit()
        self.grandparent2_name = QLineEdit()
        self.grandparent2_phone = QLineEdit()
        self.grandparent3_name = QLineEdit()
        self.grandparent3_phone = QLineEdit()
        self.grandparent4_name = QLineEdit()
        self.grandparent4_phone = QLineEdit()
        
        self.family_info_layout.addRow("父亲姓名:", self.parent1_name)
        self.family_info_layout.addRow("父亲电话:", self.parent1_phone)
        self.family_info_layout.addRow("母亲姓名:", self.parent2_name)
        self.family_info_layout.addRow("母亲电话:", self.parent2_phone)
        self.family_info_layout.addRow("祖父/外祖父姓名:", self.grandparent1_name)
        self.family_info_layout.addRow("祖父/外祖父电话:", self.grandparent1_phone)
        self.family_info_layout.addRow("祖母/外祖母姓名:", self.grandparent2_name)
        self.family_info_layout.addRow("祖母/外祖母电话:", self.grandparent2_phone)
        self.family_info_layout.addRow("祖父/外祖父姓名:", self.grandparent3_name)
        self.family_info_layout.addRow("祖父/外祖父电话:", self.grandparent3_phone)
        self.family_info_layout.addRow("祖母/外祖母姓名:", self.grandparent4_name)
        self.family_info_layout.addRow("祖母/外祖母电话:", self.grandparent4_phone)
        
        self.family_info_group.setLayout(self.family_info_layout)
        
        # 照片区域
        self.photo_layout = QHBoxLayout()
        self.student_photo = QLabel("学生照片")
        self.student_photo.setAlignment(Qt.AlignCenter)
        self.student_photo.setMinimumSize(200, 200)
        self.student_photo.setStyleSheet("border: 1px solid #ccc;")
        
        self.upload_photo_btn = QPushButton("上传照片")
        self.upload_photo_btn.clicked.connect(self.upload_photo)
        
        self.photo_layout.addWidget(self.student_photo)
        self.photo_layout.addWidget(self.upload_photo_btn)
        
        # 按钮区域
        self.student_button_layout = QHBoxLayout()
        self.add_student_btn = QPushButton("添加学生")
        self.add_student_btn.clicked.connect(self.add_student)
        self.save_student_btn = QPushButton("保存学生")
        self.save_student_btn.clicked.connect(self.save_student)
        self.delete_student_btn = QPushButton("删除学生")
        self.delete_student_btn.clicked.connect(self.delete_student)
        
        self.student_button_layout.addWidget(self.add_student_btn)
        self.student_button_layout.addWidget(self.save_student_btn)
        self.student_button_layout.addWidget(self.delete_student_btn)
        
        self.student_details_layout.addWidget(self.basic_info_group)
        self.student_details_layout.addWidget(self.family_info_group)
        self.student_details_layout.addLayout(self.photo_layout)
        self.student_details_layout.addLayout(self.student_button_layout)
        
        # 添加到主布局
        self.student_layout.addWidget(self.student_list, 1)
        self.student_layout.addWidget(self.student_details, 3)
        
        self.tabs.addTab(self.student_tab, "学生管理")
   
    def setup_timetable_tab(self):
        """设置课程表管理标签页"""
        self.timetable_tab = QWidget()
        self.timetable_layout = QVBoxLayout(self.timetable_tab)
        
        # 学期选择
        self.timetable_semester_label = QLabel("选择学期:")
        self.timetable_semester_combo = QComboBox()
        self.timetable_semester_combo.currentIndexChanged.connect(self.load_timetables)
        
        self.timetable_semester_layout = QHBoxLayout()
        self.timetable_semester_layout.addWidget(self.timetable_semester_label)
        self.timetable_semester_layout.addWidget(self.timetable_semester_combo)
        self.timetable_semester_layout.addStretch()
        
        # 课程表表格
        self.timetable_table = QTableWidget()
        self.timetable_table.setColumnCount(6)
        self.timetable_table.setHorizontalHeaderLabels(["时间段", "周一", "周二", "周三", "周四", "周五"])
        self.timetable_table.setRowCount(6)
        self.timetable_table.setVerticalHeaderLabels(["第1节", "第2节", "第3节", "第4节", "第5节", "第6节"])
        self.timetable_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.timetable_table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
        
        # 按钮区域
        self.timetable_button_layout = QHBoxLayout()
        self.add_timetable_btn = QPushButton("添加课程")
        self.add_timetable_btn.clicked.connect(self.add_timetable)
        self.edit_timetable_btn = QPushButton("编辑课程")
        self.edit_timetable_btn.clicked.connect(self.edit_timetable)
        self.delete_timetable_btn = QPushButton("删除课程")
        self.delete_timetable_btn.clicked.connect(self.delete_timetable)
        
        self.timetable_button_layout.addWidget(self.add_timetable_btn)
        self.timetable_button_layout.addWidget(self.edit_timetable_btn)
        self.timetable_button_layout.addWidget(self.delete_timetable_btn)
        
        self.timetable_layout.addLayout(self.timetable_semester_layout)
        self.timetable_layout.addWidget(self.timetable_table)
        self.timetable_layout.addLayout(self.timetable_button_layout)
        
        self.tabs.addTab(self.timetable_tab, "课程表管理")
   
    def setup_activity_tab(self):
        """设置活动管理标签页"""
        self.activity_tab = QWidget()
        self.activity_layout = QVBoxLayout(self.activity_tab)
        
        # 学期选择
        self.activity_semester_label = QLabel("选择学期:")
        self.activity_semester_combo = QComboBox()
        self.activity_semester_combo.currentIndexChanged.connect(self.load_activities)
        
        self.activity_semester_layout = QHBoxLayout()
        self.activity_semester_layout.addWidget(self.activity_semester_label)
        self.activity_semester_layout.addWidget(self.activity_semester_combo)
        self.activity_semester_layout.addStretch()
        
        # 活动列表
        self.activity_list = QTableWidget()
        self.activity_list.setColumnCount(6)
        self.activity_list.setHorizontalHeaderLabels(["ID", "活动标题", "活动类型", "日期", "时间", "持续时间"])
        self.activity_list.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.activity_list.setEditTriggers(QTableWidget.NoEditTriggers)
        self.activity_list.setSelectionBehavior(QTableWidget.SelectRows)
        self.activity_list.cellClicked.connect(self.load_activity_details)
        
        # 活动详情
        self.activity_details = QWidget()
        self.activity_details_layout = QFormLayout(self.activity_details)
        
        self.activity_title = QLineEdit()
        self.activity_type = QComboBox()
        self.activity_type.addItems(["教研活动", "班会", "比赛", "家长会", "其他"])
        self.activity_date = QDateEdit()
        self.activity_date.setCalendarPopup(True)
        self.activity_time = QLineEdit()
        self.activity_duration = QLineEdit()
        self.activity_description = QTextEdit()
        self.activity_attachments = QLineEdit()
        
        self.activity_details_layout.addRow("活动标题:", self.activity_title)
        self.activity_details_layout.addRow("活动类型:", self.activity_type)
        self.activity_details_layout.addRow("日期:", self.activity_date)
        self.activity_details_layout.addRow("时间:", self.activity_time)
        self.activity_details_layout.addRow("持续时间:", self.activity_duration)
        self.activity_details_layout.addRow("活动描述:", self.activity_description)
        self.activity_details_layout.addRow("附件:", self.activity_attachments)
        
        # 附件按钮
        self.attachments_button_layout = QHBoxLayout()
        self.add_attachment_btn = QPushButton("添加附件")
        self.add_attachment_btn.clicked.connect(self.add_attachment)
        self.view_attachment_btn = QPushButton("查看附件")
        self.view_attachment_btn.clicked.connect(self.view_attachment)
        
        self.attachments_button_layout.addWidget(self.add_attachment_btn)
        self.attachments_button_layout.addWidget(self.view_attachment_btn)
        self.attachments_button_layout.addStretch()
        
        self.activity_details_layout.addRow(self.attachments_button_layout)
        
        # 按钮区域
        self.activity_button_layout = QHBoxLayout()
        self.add_activity_btn = QPushButton("添加活动")
        self.add_activity_btn.clicked.connect(self.add_activity)
        self.save_activity_btn = QPushButton("保存活动")
        self.save_activity_btn.clicked.connect(self.save_activity)
        self.delete_activity_btn = QPushButton("删除活动")
        self.delete_activity_btn.clicked.connect(self.delete_activity)
        
        self.activity_button_layout.addWidget(self.add_activity_btn)
        self.activity_button_layout.addWidget(self.save_activity_btn)
        self.activity_button_layout.addWidget(self.delete_activity_btn)
        
        self.activity_layout.addLayout(self.activity_semester_layout)
        self.activity_layout.addWidget(self.activity_list)
        self.activity_layout.addWidget(self.activity_details)
        self.activity_layout.addLayout(self.activity_button_layout)
        
        self.tabs.addTab(self.activity_tab, "活动管理")
   
    # 学期管理相关方法
    def load_semesters(self):
        """加载学期数据"""
        self.semester_list.setRowCount(0)
        self.cursor.execute("SELECT * FROM semesters")
        semesters = self.cursor.fetchall()
        
        for row, semester in enumerate(semesters):
            self.semester_list.insertRow(row)
            for col, value in enumerate(semester):
                self.semester_list.setItem(row, col, QTableWidgetItem(str(value)))
        
        # 更新学期选择下拉框
        self.timetable_semester_combo.clear()
        self.activity_semester_combo.clear()
        
        self.cursor.execute("SELECT id, year, term FROM semesters")
        semesters = self.cursor.fetchall()
        
        for semester in semesters:
            semester_text = f"{semester[1]}年 {semester[2]}"
            self.timetable_semester_combo.addItem(semester_text, semester[0])
            self.activity_semester_combo.addItem(semester_text, semester[0])
   
    def add_semester(self):
        """添加学期对话框"""
        dialog = QWidget()
        dialog.setWindowTitle("添加学期")
        dialog.setGeometry(200, 200, 400, 300)
        
        layout = QVBoxLayout(dialog)
        
        form_layout = QFormLayout()
        
        year_edit = QLineEdit()
        term_combo = QComboBox()
        term_combo.addItems(["春季学期", "秋季学期"])
        start_date_edit = QDateEdit()
        start_date_edit.setCalendarPopup(True)
        start_date_edit.setDate(QDate.currentDate())
        end_date_edit = QDateEdit()
        end_date_edit.setCalendarPopup(True)
        end_date_edit.setDate(QDate.currentDate().addMonths(4))
        
        form_layout.addRow("学年:", year_edit)
        form_layout.addRow("学期:", term_combo)
        form_layout.addRow("开始日期:", start_date_edit)
        form_layout.addRow("结束日期:", end_date_edit)
        
        button_layout = QHBoxLayout()
        save_btn = QPushButton("保存")
        cancel_btn = QPushButton("取消")
        
        save_btn.clicked.connect(lambda: self.save_new_semester(
            dialog, year_edit.text(), term_combo.currentText(),
            start_date_edit.date().toString("yyyy-MM-dd"),
            end_date_edit.date().toString("yyyy-MM-dd")
        ))
        
        cancel_btn.clicked.connect(dialog.close)
        
        button_layout.addWidget(save_btn)
        button_layout.addWidget(cancel_btn)
        
        layout.addLayout(form_layout)
        layout.addLayout(button_layout)
        
        dialog.show()
   
    def save_new_semester(self, dialog, year, term, start_date, end_date):
        """保存新学期"""
        if not year or not term or not start_date or not end_date:
            QMessageBox.warning(self, "警告", "请填写所有必填字段")
            return
        
        self.cursor.execute(
            "INSERT INTO semesters (year, term, start_date, end_date) VALUES (?, ?, ?, ?)",
            (year, term, start_date, end_date)
        )
        self.conn.commit()
        self.load_semesters()
        dialog.close()
   
    def edit_semester(self):
        """编辑学期"""
        selected_rows = self.semester_list.selectionModel().selectedRows()
        if not selected_rows:
            QMessageBox.warning(self, "警告", "请先选择一个学期")
            return
        
        row = selected_rows[0].row()
        semester_id = int(self.semester_list.item(row, 0).text())
        year = self.semester_list.item(row, 1).text()
        term = self.semester_list.item(row, 2).text()
        start_date = self.semester_list.item(row, 3).text()
        end_date = self.semester_list.item(row, 4).text()
        
        dialog = QWidget()
        dialog.setWindowTitle("编辑学期")
        dialog.setGeometry(200, 200, 400, 300)
        
        layout = QVBoxLayout(dialog)
        
        form_layout = QFormLayout()
        
        year_edit = QLineEdit(year)
        term_combo = QComboBox()
        term_combo.addItems(["春季学期", "秋季学期"])
        term_combo.setCurrentText(term)
        start_date_edit = QDateEdit()
        start_date_edit.setCalendarPopup(True)
        start_date_edit.setDate(QDate.fromString(start_date, "yyyy-MM-dd"))
        end_date_edit = QDateEdit()
        end_date_edit.setCalendarPopup(True)
        end_date_edit.setDate(QDate.fromString(end_date, "yyyy-MM-dd"))
        
        form_layout.addRow("学年:", year_edit)
        form_layout.addRow("学期:", term_combo)
        form_layout.addRow("开始日期:", start_date_edit)
        form_layout.addRow("结束日期:", end_date_edit)
        
        button_layout = QHBoxLayout()
        save_btn = QPushButton("保存")
        cancel_btn = QPushButton("取消")
        
        save_btn.clicked.connect(lambda: self.update_semester(
            dialog, semester_id, year_edit.text(), term_combo.currentText(),
            start_date_edit.date().toString("yyyy-MM-dd"),
            end_date_edit.date().toString("yyyy-MM-dd")
        ))
        
        cancel_btn.clicked.connect(dialog.close)
        
        button_layout.addWidget(save_btn)
        button_layout.addWidget(cancel_btn)
        
        layout.addLayout(form_layout)
        layout.addLayout(button_layout)
        
        dialog.show()
   
    def update_semester(self, dialog, semester_id, year, term, start_date, end_date):
        """更新学期"""
        if not year or not term or not start_date or not end_date:
            QMessageBox.warning(self, "警告", "请填写所有必填字段")
            return
        
        self.cursor.execute(
            "UPDATE semesters SET year=?, term=?, start_date=?, end_date=? WHERE id=?",
            (year, term, start_date, end_date, semester_id)
        )
        self.conn.commit()
        self.load_semesters()
        dialog.close()
   
    def delete_semester(self):
        """删除学期"""
        selected_rows = self.semester_list.selectionModel().selectedRows()
        if not selected_rows:
            QMessageBox.warning(self, "警告", "请先选择一个学期")
            return
        
        row = selected_rows[0].row()
        semester_id = int(self.semester_list.item(row, 0).text())
        
        reply = QMessageBox.question(
            self, "确认删除", "确定要删除这个学期吗?相关的学生、课程表和活动数据也将被删除。",
            QMessageBox.Yes | QMessageBox.No
        )
        
        if reply == QMessageBox.Yes:
            # 先删除相关数据
            self.cursor.execute("DELETE FROM students WHERE semester_id=?", (semester_id,))
            self.cursor.execute("DELETE FROM timetables WHERE semester_id=?", (semester_id,))
            self.cursor.execute("DELETE FROM activities WHERE semester_id=?", (semester_id,))
            # 再删除学期
            self.cursor.execute("DELETE FROM semesters WHERE id=?", (semester_id,))
            self.conn.commit()
            self.load_semesters()
            self.load_students()
            self.load_timetables()
            self.load_activities()
   
    # 学生管理相关方法
    def load_students(self):
        """加载学生数据"""
        self.student_list.clear()
        self.cursor.execute("SELECT id, name FROM students")
        students = self.cursor.fetchall()
        
        for student in students:
            item = QListWidgetItem(f"{student[1]} (ID: {student[0]})")
            item.setData(Qt.UserRole, student[0])
            self.student_list.addItem(item)
   
    def load_student_details(self, item):
        """加载学生详情"""
        student_id = item.data(Qt.UserRole)
        self.current_student_id = student_id
        
        self.cursor.execute("SELECT * FROM students WHERE id=?", (student_id,))
        student = self.cursor.fetchone()
        
        if student:
            self.student_name.setText(student[1])
            
            # 设置性别
            if student[2] == "男":
                self.student_gender_male.setChecked(True)
            else:
                self.student_gender_female.setChecked(True)
            
            self.student_birth_date.setDate(QDate.fromString(student[3], "yyyy-MM-dd"))
            self.student_id_number.setText(student[4] or "")
            self.student_address.setText(student[5] or "")
            
            # 家庭成员信息
            self.parent1_name.setText(student[7] or "")
            self.parent1_phone.setText(student[8] or "")
            self.parent2_name.setText(student[9] or "")
            self.parent2_phone.setText(student[10] or "")
            self.grandparent1_name.setText(student[11] or "")
            self.grandparent1_phone.setText(student[12] or "")
            self.grandparent2_name.setText(student[13] or "")
            self.grandparent2_phone.setText(student[14] or "")
            self.grandparent3_name.setText(student[15] or "")
            self.grandparent3_phone.setText(student[16] or "")
            self.grandparent4_name.setText(student[17] or "")
            self.grandparent4_phone.setText(student[18] or "")
            
            # 加载照片
            if student[6]:
                pixmap = QPixmap()
                pixmap.loadFromData(student[6])
                self.student_photo.setPixmap(pixmap.scaled(
                    self.student_photo.width(),
                    self.student_photo.height(),
                    Qt.KeepAspectRatio,
                    Qt.SmoothTransformation
                ))
   
    def add_student(self):
        """添加学生"""
        # 清空表单
        self.current_student_id = None
        self.student_name.clear()
        self.student_gender_male.setChecked(True)
        self.student_birth_date.setDate(QDate.currentDate())
        self.student_id_number.clear()
        self.student_address.clear()
        
        # 清空家庭成员信息
        self.parent1_name.clear()
        self.parent1_phone.clear()
        self.parent2_name.clear()
        self.parent2_phone.clear()
        self.grandparent1_name.clear()
        self.grandparent1_phone.clear()
        self.grandparent2_name.clear()
        self.grandparent2_phone.clear()
        self.grandparent3_name.clear()
        self.grandparent3_phone.clear()
        self.grandparent4_name.clear()
        self.grandparent4_phone.clear()
        
        # 清空照片
        self.student_photo.setText("学生照片")
        self.student_photo.setPixmap(QPixmap())
   
    def save_student(self):
        """保存学生信息"""
        name = self.student_name.text()
        gender = "男" if self.student_gender_male.isChecked() else "女"
        birth_date = self.student_birth_date.date().toString("yyyy-MM-dd")
        id_number = self.student_id_number.text()
        address = self.student_address.text()
        
        # 家庭成员信息
        parent1_name = self.parent1_name.text()
        parent1_phone = self.parent1_phone.text()
        parent2_name = self.parent2_name.text()
        parent2_phone = self.parent2_phone.text()
        grandparent1_name = self.grandparent1_name.text()
        grandparent1_phone = self.grandparent1_phone.text()
        grandparent2_name = self.grandparent2_name.text()
        grandparent2_phone = self.grandparent2_phone.text()
        grandparent3_name = self.grandparent3_name.text()
        grandparent3_phone = self.grandparent3_phone.text()
        grandparent4_name = self.grandparent4_name.text()
        grandparent4_phone = self.grandparent4_phone.text()
        
        # 获取照片
        photo_data = None
        if not self.student_photo.text() and hasattr(self.student_photo, "pixmap"):
            pixmap = self.student_photo.pixmap()
            if pixmap and not pixmap.isNull():
                byte_array = QtCore.QByteArray()
                buffer = QtCore.QBuffer(byte_array)
                buffer.open(QtCore.QIODevice.WriteOnly)
                pixmap.save(buffer, "PNG")
                photo_data = byte_array.data()
        
        if not name:
            QMessageBox.warning(self, "警告", "请输入学生姓名")
            return
        
        # 获取当前选择的学期
        semester_id = None
        if self.timetable_semester_combo.count() > 0:
            semester_id = self.timetable_semester_combo.currentData()
        
        if not semester_id:
            QMessageBox.warning(self, "警告", "请先创建并选择一个学期")
            return
        
        if self.current_student_id:
            # 更新学生信息
            self.cursor.execute(
                """UPDATE students SET name=?, gender=?, birth_date=?, id_number=?, address=?,
                photo=?, parent1_name=?, parent1_phone=?, parent2_name=?, parent2_phone=?,
                grandparent1_name=?, grandparent1_phone=?, grandparent2_name=?, grandparent2_phone=?,
                grandparent3_name=?, grandparent3_phone=?, grandparent4_name=?, grandparent4_phone=?,
                semester_id=? WHERE id=?""",
                (name, gender, birth_date, id_number, address, photo_data,
                 parent1_name, parent1_phone, parent2_name, parent2_phone,
                 grandparent1_name, grandparent1_phone, grandparent2_name, grandparent2_phone,
                 grandparent3_name, grandparent3_phone, grandparent4_name, grandparent4_phone,
                 semester_id, self.current_student_id)
            )
        else:
            # 添加新学生
            self.cursor.execute(
                """INSERT INTO students (name, gender, birth_date, id_number, address, photo,
                parent1_name, parent1_phone, parent2_name, parent2_phone,
                grandparent1_name, grandparent1_phone, grandparent2_name, grandparent2_phone,
                grandparent3_name, grandparent3_phone, grandparent4_name, grandparent4_phone,
                semester_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
                (name, gender, birth_date, id_number, address, photo_data,
                 parent1_name, parent1_phone, parent2_name, parent2_phone,
                 grandparent1_name, grandparent1_phone, grandparent2_name, grandparent2_phone,
                 grandparent3_name, grandparent3_phone, grandparent4_name, grandparent4_phone,
                 semester_id)
            )
        
        self.conn.commit()
        self.load_students()
        QMessageBox.information(self, "成功", "学生信息已保存")
   
    def delete_student(self):
        """删除学生"""
        if not hasattr(self, "current_student_id") or not self.current_student_id:
            QMessageBox.warning(self, "警告", "请先选择一个学生")
            return
        
        reply = QMessageBox.question(
            self, "确认删除", "确定要删除这个学生吗?",
            QMessageBox.Yes | QMessageBox.No
        )
        
        if reply == QMessageBox.Yes:
            self.cursor.execute("DELETE FROM students WHERE id=?", (self.current_student_id,))
            self.conn.commit()
            self.load_students()
            self.add_student()  # 清空表单
            QMessageBox.information(self, "成功", "学生已删除")
   
    def upload_photo(self):
        """上传学生照片"""
        file_path, _ = QFileDialog.getOpenFileName(
            self, "选择照片", "", "图像文件 (*.png *.jpg *.jpeg *.bmp)"
        )
        
        if file_path:
            pixmap = QPixmap(file_path)
            self.student_photo.setPixmap(pixmap.scaled(
                self.student_photo.width(),
                self.student_photo.height(),
                Qt.KeepAspectRatio,
                Qt.SmoothTransformation
            ))
   
    # 课程表管理相关方法
    def load_timetables(self):
        """加载课程表"""
        # 清空表格
        for row in range(self.timetable_table.rowCount()):
            for col in range(1, self.timetable_table.columnCount()):  # 跳过第一列(时间段)
                self.timetable_table.setItem(row, col, QTableWidgetItem(""))
        
        # 获取当前选择的学期
        semester_id = self.timetable_semester_combo.currentData()
        if not semester_id:
            return
        
        # 加载课程表数据
        self.cursor.execute(
            "SELECT day_of_week, period, course_name, class_name FROM timetables WHERE semester_id=?",
            (semester_id,)
        )
        timetables = self.cursor.fetchall()
        
        for timetable in timetables:
            day_of_week = timetable[0]  # 0-4 对应 周一到周五
            period = timetable[1]      # 0-5 对应 第1节到第6节
            course_name = timetable[2]
            class_name = timetable[3]
            
            item = QTableWidgetItem(f"{course_name}\n{class_name}")
            item.setTextAlignment(Qt.AlignCenter)
            self.timetable_table.setItem(period, day_of_week + 1, item)  # +1 是因为第一列是时间段
   
    def add_timetable(self):
        """添加课程"""
        semester_id = self.timetable_semester_combo.currentData()
        if not semester_id:
            QMessageBox.warning(self, "警告", "请先选择一个学期")
            return
        
        dialog = QWidget()
        dialog.setWindowTitle("添加课程")
        dialog.setGeometry(200, 200, 400, 300)
        
        layout = QVBoxLayout(dialog)
        
        form_layout = QFormLayout()
        
        day_combo = QComboBox()
        day_combo.addItems(["周一", "周二", "周三", "周四", "周五"])
        
        period_combo = QComboBox()
        period_combo.addItems(["第1节", "第2节", "第3节", "第4节", "第5节", "第6节"])
        
        course_name_edit = QLineEdit()
        class_name_edit = QLineEdit()
        location_edit = QLineEdit()
        
        form_layout.addRow("星期:", day_combo)
        form_layout.addRow("时间段:", period_combo)
        form_layout.addRow("课程名称:", course_name_edit)
        form_layout.addRow("班级:", class_name_edit)
        form_layout.addRow("地点:", location_edit)
        
        button_layout = QHBoxLayout()
        save_btn = QPushButton("保存")
        cancel_btn = QPushButton("取消")
        
        save_btn.clicked.connect(lambda: self.save_timetable(
            dialog, semester_id, day_combo.currentIndex(), period_combo.currentIndex(),
            course_name_edit.text(), class_name_edit.text(), location_edit.text()
        ))
        
        cancel_btn.clicked.connect(dialog.close)
        
        button_layout.addWidget(save_btn)
        button_layout.addWidget(cancel_btn)
        
        layout.addLayout(form_layout)
        layout.addLayout(button_layout)
        
        dialog.show()
   
    def save_timetable(self, dialog, semester_id, day_of_week, period, course_name, class_name, location):
        """保存课程表"""
        if not course_name or not class_name:
            QMessageBox.warning(self, "警告", "请填写课程名称和班级")
            return
        
        # 检查是否已有课程安排
        self.cursor.execute(
            "SELECT id FROM timetables WHERE semester_id=? AND day_of_week=? AND period=?",
            (semester_id, day_of_week, period)
        )
        
        existing_timetable = self.cursor.fetchone()
        
        if

学期, 学生

Ant爱上猫
OP
  

各位坛友,尤其是从事教师行业的大佬,希望可以提供改进意见,暂时就想到这么多。不想让软件太复杂就是起一个简单记录的功能
不忘初xin   

你所粘贴的Python代码只能算是一个框架,还缺少东西(例如:数据库连接信息)
您需要登录后才可以回帖 登录 | 立即注册

返回顶部