111 lines
4.2 KiB
Python
111 lines
4.2 KiB
Python
import os
|
|
import platform
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from PySide6.QtCore import QObject, QThread, Signal
|
|
from PySide6.QtWidgets import QMainWindow, QFileDialog
|
|
|
|
from module.doc import DocPaper
|
|
from module.schema import Course, Student, Question
|
|
from ui.pyui.main import Ui_MainWindow
|
|
|
|
|
|
def resource_path(relative_path: str) -> str:
|
|
if hasattr(sys, '_MEIPASS'):
|
|
base_path = sys._MEIPASS
|
|
else:
|
|
base_path = os.path.abspath(".")
|
|
return os.path.join(base_path, relative_path)
|
|
|
|
|
|
class Worker(QObject):
|
|
progress = Signal(str)
|
|
finished = Signal()
|
|
|
|
def __init__(self, input_filepath: str, output_filepath: str, output_filename: str):
|
|
super().__init__()
|
|
self.input_filepath = input_filepath
|
|
self.output_filepath = output_filepath
|
|
self.output_filename = output_filename
|
|
|
|
def run(self):
|
|
self.progress.emit("第一步:正在读取课程信息...")
|
|
course = Course.load_from_xls(self.input_filepath)
|
|
self.progress.emit("第二步:正在读取学生信息...")
|
|
students = Student.load_from_xls(self.input_filepath)
|
|
self.progress.emit("第三步:正在读取题目信息...")
|
|
questions = Question.load_from_csv(str(Path(os.environ["APPDATA"]) / "dtg" / "questions.csv"))
|
|
|
|
d = DocPaper(self.output_filename, template_path=resource_path("template/template.docx"))
|
|
for student in students:
|
|
self.progress.emit(f"第四步:({student.no}/{len(students)})正在处理学生:{student.name},学号:{student.so}")
|
|
student.pick_question(questions)
|
|
d.add_paper(course, student)
|
|
self.progress.emit("第五步:正在保存文件...")
|
|
d.save(self.output_filepath)
|
|
self.progress.emit("第六步:文件保存成功!")
|
|
os.startfile(Path(self.output_filepath) / f"{self.output_filename}.docx")
|
|
|
|
|
|
class MainWindow(QMainWindow, Ui_MainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.setupUi(self)
|
|
self.setWindowTitle("答辩题目生成器")
|
|
|
|
self.select_student_list.clicked.connect(self.choose_student_list)
|
|
self.select_output_dir.clicked.connect(self.choose_output_dir)
|
|
self.edit_topics.clicked.connect(self.edit_questions)
|
|
self.start.clicked.connect(self.start_generate)
|
|
|
|
def on_button_clicked(self):
|
|
self.statusBar().showMessage("这是状态栏信息")
|
|
|
|
def choose_student_list(self):
|
|
file_path, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "Excel 文件 (*.xlsx);")
|
|
if file_path:
|
|
self.student_list_path.setText(file_path)
|
|
|
|
input_dir_path = file_path[:file_path.rfind('/')]
|
|
default_output_filename = file_path[file_path.rfind('/') + 1:file_path.rfind('-点名册')]
|
|
|
|
self.output_path.setText(input_dir_path)
|
|
self.output_filename.setText(default_output_filename)
|
|
|
|
def choose_output_dir(self):
|
|
dir_path = QFileDialog.getExistingDirectory(self, "选择文件夹", "")
|
|
if dir_path:
|
|
self.output_path.setText(dir_path)
|
|
|
|
def edit_questions(self):
|
|
csv_path = Path(os.environ["APPDATA"]) / "dtg" / "questions.csv"
|
|
|
|
if platform.system() == "Windows":
|
|
os.startfile(csv_path.resolve())
|
|
elif platform.system() == "Darwin": # macOS
|
|
subprocess.run(["open", csv_path.resolve()])
|
|
else: # Linux
|
|
subprocess.run(["xdg-open", csv_path.resolve()])
|
|
|
|
self.update_statusbar("已打开题目文件,请在外部程序编辑后保存。")
|
|
|
|
def start_generate(self):
|
|
self.thread = QThread()
|
|
self.worker = Worker(self.student_list_path.text(), self.output_path.text(), self.output_filename.text())
|
|
self.worker.moveToThread(self.thread)
|
|
|
|
# 线程启动与信号连接
|
|
self.thread.started.connect(self.worker.run)
|
|
self.worker.progress.connect(self.update_statusbar)
|
|
self.worker.finished.connect(self.thread.quit)
|
|
self.worker.finished.connect(self.worker.deleteLater)
|
|
self.thread.finished.connect(self.thread.deleteLater)
|
|
|
|
# 启动线程
|
|
self.thread.start()
|
|
|
|
def update_statusbar(self, message):
|
|
self.statusBar().showMessage(message)
|