diff --git a/工具v3/Ui_指定题号编译pdf.py b/工具v3/Ui_指定题号编译pdf.py new file mode 100644 index 00000000..aabce3dc --- /dev/null +++ b/工具v3/Ui_指定题号编译pdf.py @@ -0,0 +1,256 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file '指定题号编译pdf.ui' +## +## Created by: Qt User Interface Compiler version 6.6.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QCheckBox, QHBoxLayout, QLabel, + QLineEdit, QPlainTextEdit, QPushButton, QRadioButton, + QSizePolicy, QVBoxLayout, QWidget) + +class Ui_Form(object): + def setupUi(self, Form): + if not Form.objectName(): + Form.setObjectName(u"Form") + Form.resize(890, 361) + self.pushButton_exec = QPushButton(Form) + self.pushButton_exec.setObjectName(u"pushButton_exec") + self.pushButton_exec.setGeometry(QRect(660, 220, 221, 131)) + font = QFont() + font.setBold(True) + self.pushButton_exec.setFont(font) + self.label_3 = QLabel(Form) + self.label_3.setObjectName(u"label_3") + self.label_3.setGeometry(QRect(390, 20, 61, 16)) + self.lineEdit_path = QLineEdit(Form) + self.lineEdit_path.setObjectName(u"lineEdit_path") + self.lineEdit_path.setGeometry(QRect(390, 40, 491, 20)) + self.pushButton_SelectPath = QPushButton(Form) + self.pushButton_SelectPath.setObjectName(u"pushButton_SelectPath") + self.pushButton_SelectPath.setGeometry(QRect(800, 10, 81, 24)) + self.verticalLayoutWidget = QWidget(Form) + self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget") + self.verticalLayoutWidget.setGeometry(QRect(390, 80, 81, 271)) + self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setObjectName(u"verticalLayout") + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.label_4 = QLabel(self.verticalLayoutWidget) + self.label_4.setObjectName(u"label_4") + self.label_4.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter) + + self.verticalLayout.addWidget(self.label_4) + + self.radioButton_student = QRadioButton(self.verticalLayoutWidget) + self.radioButton_student.setObjectName(u"radioButton_student") + self.radioButton_student.setChecked(True) + + self.verticalLayout.addWidget(self.radioButton_student) + + self.radioButton_teacher = QRadioButton(self.verticalLayoutWidget) + self.radioButton_teacher.setObjectName(u"radioButton_teacher") + + self.verticalLayout.addWidget(self.radioButton_teacher) + + self.verticalLayoutWidget_2 = QWidget(Form) + self.verticalLayoutWidget_2.setObjectName(u"verticalLayoutWidget_2") + self.verticalLayoutWidget_2.setGeometry(QRect(490, 80, 151, 271)) + self.verticalLayout_2 = QVBoxLayout(self.verticalLayoutWidget_2) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) + self.label_5 = QLabel(self.verticalLayoutWidget_2) + self.label_5.setObjectName(u"label_5") + + self.verticalLayout_2.addWidget(self.label_5) + + self.checkBox_space = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_space.setObjectName(u"checkBox_space") + + self.verticalLayout_2.addWidget(self.checkBox_space) + + self.checkBox_ans = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_ans.setObjectName(u"checkBox_ans") + + self.verticalLayout_2.addWidget(self.checkBox_ans) + + self.checkBox_objs = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_objs.setObjectName(u"checkBox_objs") + self.checkBox_objs.setCheckable(True) + self.checkBox_objs.setTristate(False) + + self.verticalLayout_2.addWidget(self.checkBox_objs) + + self.checkBox_tags = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_tags.setObjectName(u"checkBox_tags") + + self.verticalLayout_2.addWidget(self.checkBox_tags) + + self.checkBox_solution = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_solution.setObjectName(u"checkBox_solution") + + self.verticalLayout_2.addWidget(self.checkBox_solution) + + self.checkBox_usages = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_usages.setObjectName(u"checkBox_usages") + + self.verticalLayout_2.addWidget(self.checkBox_usages) + + self.checkBox_origin = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_origin.setObjectName(u"checkBox_origin") + + self.verticalLayout_2.addWidget(self.checkBox_origin) + + self.checkBox_remark = QCheckBox(self.verticalLayoutWidget_2) + self.checkBox_remark.setObjectName(u"checkBox_remark") + + self.verticalLayout_2.addWidget(self.checkBox_remark) + + self.verticalLayoutWidget_3 = QWidget(Form) + self.verticalLayoutWidget_3.setObjectName(u"verticalLayoutWidget_3") + self.verticalLayoutWidget_3.setGeometry(QRect(660, 80, 222, 121)) + self.verticalLayout_usagepanel = QVBoxLayout(self.verticalLayoutWidget_3) + self.verticalLayout_usagepanel.setObjectName(u"verticalLayout_usagepanel") + self.verticalLayout_usagepanel.setContentsMargins(0, 0, 0, 0) + self.label_6 = QLabel(self.verticalLayoutWidget_3) + self.label_6.setObjectName(u"label_6") + + self.verticalLayout_usagepanel.addWidget(self.label_6) + + self.horizontalLayout = QHBoxLayout() + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.label_9 = QLabel(self.verticalLayoutWidget_3) + self.label_9.setObjectName(u"label_9") + + self.horizontalLayout.addWidget(self.label_9) + + self.lineEdit_high = QLineEdit(self.verticalLayoutWidget_3) + self.lineEdit_high.setObjectName(u"lineEdit_high") + self.lineEdit_high.setEnabled(True) + + self.horizontalLayout.addWidget(self.lineEdit_high) + + self.label_10 = QLabel(self.verticalLayoutWidget_3) + self.label_10.setObjectName(u"label_10") + + self.horizontalLayout.addWidget(self.label_10) + + self.lineEdit_low = QLineEdit(self.verticalLayoutWidget_3) + self.lineEdit_low.setObjectName(u"lineEdit_low") + + self.horizontalLayout.addWidget(self.lineEdit_low) + + + self.verticalLayout_usagepanel.addLayout(self.horizontalLayout) + + self.label_7 = QLabel(self.verticalLayoutWidget_3) + self.label_7.setObjectName(u"label_7") + + self.verticalLayout_usagepanel.addWidget(self.label_7) + + self.lineEdit_grades = QLineEdit(self.verticalLayoutWidget_3) + self.lineEdit_grades.setObjectName(u"lineEdit_grades") + + self.verticalLayout_usagepanel.addWidget(self.lineEdit_grades) + + self.plainTextEdit_allitems = QPlainTextEdit(Form) + self.plainTextEdit_allitems.setObjectName(u"plainTextEdit_allitems") + self.plainTextEdit_allitems.setGeometry(QRect(10, 160, 371, 191)) + self.label = QLabel(Form) + self.label.setObjectName(u"label") + self.label.setGeometry(QRect(10, 140, 54, 16)) + self.label_2 = QLabel(Form) + self.label_2.setObjectName(u"label_2") + self.label_2.setGeometry(QRect(11, 11, 60, 16)) + self.plainTextEdit_newitems = QPlainTextEdit(Form) + self.plainTextEdit_newitems.setObjectName(u"plainTextEdit_newitems") + self.plainTextEdit_newitems.setGeometry(QRect(10, 30, 371, 71)) + self.widget = QWidget(Form) + self.widget.setObjectName(u"widget") + self.widget.setGeometry(QRect(90, 110, 241, 28)) + self.horizontalLayout_4 = QHBoxLayout(self.widget) + self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") + self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) + self.pushButton_add = QPushButton(self.widget) + self.pushButton_add.setObjectName(u"pushButton_add") + + self.horizontalLayout_4.addWidget(self.pushButton_add) + + self.horizontalLayout_3 = QHBoxLayout() + self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") + self.pushButton_delete = QPushButton(self.widget) + self.pushButton_delete.setObjectName(u"pushButton_delete") + + self.horizontalLayout_3.addWidget(self.pushButton_delete) + + self.horizontalLayout_2 = QHBoxLayout() + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.label_11 = QLabel(self.widget) + self.label_11.setObjectName(u"label_11") + self.label_11.setMaximumSize(QSize(20, 16777215)) + + self.horizontalLayout_2.addWidget(self.label_11) + + self.lineEdit_index = QLineEdit(self.widget) + self.lineEdit_index.setObjectName(u"lineEdit_index") + self.lineEdit_index.setMaximumSize(QSize(20, 16777215)) + + self.horizontalLayout_2.addWidget(self.lineEdit_index) + + self.label_12 = QLabel(self.widget) + self.label_12.setObjectName(u"label_12") + self.label_12.setMaximumSize(QSize(20, 16777215)) + + self.horizontalLayout_2.addWidget(self.label_12) + + + self.horizontalLayout_3.addLayout(self.horizontalLayout_2) + + + self.horizontalLayout_4.addLayout(self.horizontalLayout_3) + + + self.retranslateUi(Form) + + QMetaObject.connectSlotsByName(Form) + # setupUi + + def retranslateUi(self, Form): + Form.setWindowTitle(QCoreApplication.translate("Form", u"\u6307\u5b9a\u9898\u53f7\u7f16\u8bd1", None)) + self.pushButton_exec.setText(QCoreApplication.translate("Form", u"\u5f00\u59cb\u751f\u6210\u4e0e\u7f16\u8bd1", None)) + self.label_3.setText(QCoreApplication.translate("Form", u"\u6587\u4ef6\u8def\u5f84", None)) + self.pushButton_SelectPath.setText(QCoreApplication.translate("Form", u"\u9009\u62e9\u8def\u5f84", None)) + self.label_4.setText(QCoreApplication.translate("Form", u"\u7248\u5f0f\u9009\u62e9", None)) + self.radioButton_student.setText(QCoreApplication.translate("Form", u"\u5b66\u751f\u7248", None)) + self.radioButton_teacher.setText(QCoreApplication.translate("Form", u"\u6559\u5e08\u7248", None)) + self.label_5.setText(QCoreApplication.translate("Form", u"\u5185\u5bb9\u9009\u9879", None)) + self.checkBox_space.setText(QCoreApplication.translate("Form", u"\u9898\u540e\u7a7a\u95f4", None)) + self.checkBox_ans.setText(QCoreApplication.translate("Form", u"\u7b54\u6848", None)) + self.checkBox_objs.setText(QCoreApplication.translate("Form", u"\u8bfe\u65f6\u76ee\u6807", None)) + self.checkBox_tags.setText(QCoreApplication.translate("Form", u"\u9898\u76ee\u6807\u7b7e", None)) + self.checkBox_solution.setText(QCoreApplication.translate("Form", u"\u89e3\u7b54\u4e0e\u63d0\u793a", None)) + self.checkBox_usages.setText(QCoreApplication.translate("Form", u"\u4f7f\u7528\u8bb0\u5f55", None)) + self.checkBox_origin.setText(QCoreApplication.translate("Form", u"\u6765\u6e90", None)) + self.checkBox_remark.setText(QCoreApplication.translate("Form", u"\u5907\u6ce8", None)) + self.label_6.setText(QCoreApplication.translate("Form", u"\u4f7f\u7528\u8bb0\u5f55\u9009\u62e9(\u90fd\u7559\u7a7a\u4e3a\u5168\u663e\u793a)", None)) + self.label_9.setText(QCoreApplication.translate("Form", u"\u9ad8", None)) + self.label_10.setText(QCoreApplication.translate("Form", u"\u4f4e", None)) + self.label_7.setText(QCoreApplication.translate("Form", u"\u5c4a\u522b\u9009\u62e9(\u7528 \",\" \u5206\u9694, \u7559\u7a7a\u4e3a\u5168\u663e\u793a)", None)) + self.label.setText(QCoreApplication.translate("Form", u"\u9898\u53f7\u5217\u8868", None)) + self.label_2.setText(QCoreApplication.translate("Form", u"\u6807\u9898\u4e0e\u9898\u53f7", None)) + self.plainTextEdit_newitems.setPlaceholderText(QCoreApplication.translate("Form", u"\u5982: \u96c6\u5408: 2:30,32 \u6216 \"\u96c6\u5408\": \"2:30\", \"\u51fd\u6570\": \"5,60,71:75\"(\u53ef\u6709\u56de\u8f66)", None)) + self.pushButton_add.setText(QCoreApplication.translate("Form", u"\u6dfb\u52a0\u4e00\u9879\u6216\u591a\u9879", None)) + self.pushButton_delete.setText(QCoreApplication.translate("Form", u"\u5220\u53bb\u4e00\u9879", None)) + self.label_11.setText(QCoreApplication.translate("Form", u"\u7b2c", None)) + self.label_12.setText(QCoreApplication.translate("Form", u"\u9879", None)) + # retranslateUi + diff --git a/工具v3/database_tools_2.py b/工具v3/database_tools_2.py index a2930cc8..bc5eb744 100644 --- a/工具v3/database_tools_2.py +++ b/工具v3/database_tools_2.py @@ -1219,71 +1219,75 @@ def generateLaTeXBodyContentfromMariaDB(cursor,id,misc): #根据id,读取的json sql = "SELECT content,ans,solution,origin,space FROM problems WHERE ID = %s;" val = (id,) cursor.execute(sql,val) - content,ans,solution,raw_origin,space = cursor.fetchall()[0] - if ans is None: - ans = "" - if solution is None: - solution = "" - origin = json.loads(raw_origin) - #以下生成obj_list - sql = "SELECT obj_ID FROM objcorresp WHERE ID = %s;" - cursor.execute(sql,val) ret_list = cursor.fetchall() - obj_list = [] - for id_raw in ret_list: - obj_id = id_raw[0] - sql = "SELECT obj_content FROM lessonobj WHERE objid = %s;" - objval = (obj_id,) - cursor.execute(sql,objval) - obj_list.append(f"{obj_id}\t{cursor.fetchall()[0][0]}") - sql = "SELECT tagname FROM tagcorresp WHERE ID = %s;" - cursor.execute(sql,val) - tag_list = [t[0] for t in cursor.fetchall()] - sql = "SELECT date,remark_content FROM remarks WHERE ID = %s;" - cursor.execute(sql,val) - remark_list = sorted([f"{t[0]}\t{t[1]}" for t in cursor.fetchall()]) - sql = "SELECT date,classname,diff FROM usages WHERE ID = %s;" - cursor.execute(sql,val) - usages_fetched = [(u[0] if not u[0] is None else "",u[1],json.loads(u[2])) for u in cursor.fetchall()] - usages_raw = sorted(usages_fetched) - if not "教师版" in misc or misc["教师版"] == False: - output = f"\n\\item {{\\tiny ({id})}} {content}" - if "字段显示设置" in misc and "答案" in misc["字段显示设置"] and misc["字段显示设置"]["答案"] == True: - ans = ans if len(ans) > 0 else "暂无答案" - output += f"\n\n答案: \\textcolor{{{('red' if ans != '暂无答案' else 'blue')}}}{{{ans}}}\n\n" - if "字段显示设置" in misc and "题后空间" in misc["字段显示设置"] and misc["字段显示设置"]["题后空间"] == True: - space = f"\n\n\\vspace*{{{space}}}\n\n" if len(space) > 0 else "" - output += space + if len(ret_list) != 0: + content,ans,solution,raw_origin,space = ret_list[0] + if ans is None: + ans = "" + if solution is None: + solution = "" + origin = json.loads(raw_origin) + #以下生成obj_list + sql = "SELECT obj_ID FROM objcorresp WHERE ID = %s;" + cursor.execute(sql,val) + ret_list = cursor.fetchall() + obj_list = [] + for id_raw in ret_list: + obj_id = id_raw[0] + sql = "SELECT obj_content FROM lessonobj WHERE objid = %s;" + objval = (obj_id,) + cursor.execute(sql,objval) + obj_list.append(f"{obj_id}\t{cursor.fetchall()[0][0]}") + sql = "SELECT tagname FROM tagcorresp WHERE ID = %s;" + cursor.execute(sql,val) + tag_list = [t[0] for t in cursor.fetchall()] + sql = "SELECT date,remark_content FROM remarks WHERE ID = %s;" + cursor.execute(sql,val) + remark_list = sorted([f"{t[0]}\t{t[1]}" for t in cursor.fetchall()]) + sql = "SELECT date,classname,diff FROM usages WHERE ID = %s;" + cursor.execute(sql,val) + usages_fetched = [(u[0] if not u[0] is None else "",u[1],json.loads(u[2])) for u in cursor.fetchall()] + usages_raw = sorted(usages_fetched) + if not "教师版" in misc or misc["教师版"] == False: + output = f"\n\\item {{\\tiny ({id})}} {content}" + if "字段显示设置" in misc and "答案" in misc["字段显示设置"] and misc["字段显示设置"]["答案"] == True: + ans = ans if len(ans) > 0 else "暂无答案" + output += f"\n\n答案: \\textcolor{{{('red' if ans != '暂无答案' else 'blue')}}}{{{ans}}}\n\n" + if "字段显示设置" in misc and "题后空间" in misc["字段显示设置"] and misc["字段显示设置"]["题后空间"] == True: + space = f"\n\n\\vspace*{{{space}}}\n\n" if len(space) > 0 else "" + output += space + else: + output = f"\n\\item ({id}) {content}" + if "备注" in misc["字段显示设置"] and misc["字段显示设置"]["备注"] == True: + remark = r"\\".join(remark_list) if len(remark_list) > 0 else "暂无备注" + output += f"\n\n备注: \\textcolor[rgb]{{0,0.5,0.2}}{{{remark}}}\n\n" + if "课时目标" in misc["字段显示设置"] and misc["字段显示设置"]["课时目标"] == True: + if len(obj_list) == 0: + obj_string = "暂无目标" + else: + obj_string = '\n\n'.join(obj_list) + objs = f"\n\n目标:\n\n{obj_string}\n\n" + output += objs + if "题目标签" in misc["字段显示设置"] and misc["字段显示设置"]["题目标签"] == True: + if len(tag_list) == 0: + tags = "暂无标签" + else: + tags = '; '.join(tag_list) + output += f"\n\n标签: \\textcolor[rgb]{{0.5,0.6,0.8}}{{{tags}}}\n\n" + if "答案" in misc["字段显示设置"] and misc["字段显示设置"]["答案"] == True: + ans = ans if len(ans) > 0 else "暂无答案" + output += f"\n\n答案: \\textcolor{{{('red' if ans != '暂无答案' else 'blue')}}}{{{ans}}}\n\n" + if "解答与提示" in misc["字段显示设置"] and misc["字段显示设置"]["解答与提示"] == True: + solution = solution if len(solution) > 0 else "暂无解答或提示" + output += f"\n\n解答或提示: \\textcolor{{magenta}}{{{solution}}}\n\n" + if "使用记录" in misc["字段显示设置"] and type(misc["字段显示设置"]["使用记录"]) in (list,tuple) and not -2 in misc["字段显示设置"]["使用记录"]: + usages = f"\n\n使用记录:\n\n{GenerateUsageTexCode(usages_raw,misc)}\n\n" + output += usages + if "来源" in misc["字段显示设置"] and misc["字段显示设置"]["来源"] == True: + origin = generate_origin(origin) if len(origin) > 0 else "未记录来源" + output += f"\n\n来源: {origin}\n\n" else: - output = f"\n\\item ({id}) {content}" - if "备注" in misc["字段显示设置"] and misc["字段显示设置"]["备注"] == True: - remark = r"\\".join(remark_list) if len(remark_list) > 0 else "暂无备注" - output += f"\n\n备注: \\textcolor[rgb]{{0,0.5,0.2}}{{{remark}}}\n\n" - if "课时目标" in misc["字段显示设置"] and misc["字段显示设置"]["课时目标"] == True: - if len(obj_list) == 0: - obj_string = "暂无目标" - else: - obj_string = '\n\n'.join(obj_list) - objs = f"\n\n目标:\n\n{obj_string}\n\n" - output += objs - if "题目标签" in misc["字段显示设置"] and misc["字段显示设置"]["题目标签"] == True: - if len(tag_list) == 0: - tags = "暂无标签" - else: - tags = '; '.join(tag_list) - output += f"\n\n标签: \\textcolor[rgb]{{0.5,0.6,0.8}}{{{tags}}}\n\n" - if "答案" in misc["字段显示设置"] and misc["字段显示设置"]["答案"] == True: - ans = ans if len(ans) > 0 else "暂无答案" - output += f"\n\n答案: \\textcolor{{{('red' if ans != '暂无答案' else 'blue')}}}{{{ans}}}\n\n" - if "解答与提示" in misc["字段显示设置"] and misc["字段显示设置"]["解答与提示"] == True: - solution = solution if len(solution) > 0 else "暂无解答或提示" - output += f"\n\n解答或提示: \\textcolor{{magenta}}{{{solution}}}\n\n" - if "使用记录" in misc["字段显示设置"] and type(misc["字段显示设置"]["使用记录"]) in (list,tuple) and not -2 in misc["字段显示设置"]["使用记录"]: - usages = f"\n\n使用记录:\n\n{GenerateUsageTexCode(usages_raw,misc)}\n\n" - output += usages - if "来源" in misc["字段显示设置"] and misc["字段显示设置"]["来源"] == True: - origin = generate_origin(origin) if len(origin) > 0 else "未记录来源" - output += f"\n\n来源: {origin}\n\n" + output = f"\\item ({id}) 题号有误!!!" return output diff --git a/工具v3/指定题号编译pdf.py b/工具v3/指定题号编译pdf.py new file mode 100644 index 00000000..de8ce376 --- /dev/null +++ b/工具v3/指定题号编译pdf.py @@ -0,0 +1,161 @@ +from PySide6.QtWidgets import QWidget, QApplication, QFileDialog +from Ui_指定题号编译pdf import Ui_Form +import os +from database_tools_2 import * + + + + + +class MyWindow(QWidget,Ui_Form): + def __init__(self): + super().__init__() + self.setupUi(self) + self.bind() + def bind(self): + outputpath = os.path.join(os.getcwd(),"临时文件") + self.lineEdit_path.setText(outputpath) + self.TitleID_list = [] + self.TeachersCheckBoxList = [self.checkBox_ans,self.checkBox_objs,self.checkBox_tags,self.checkBox_solution,self.checkBox_usages,self.checkBox_origin,self.checkBox_remark] + self.StudentsCheckBoxList = [self.checkBox_space,self.checkBox_ans] + self.ContnetCheckBoxList = [self.checkBox_ans,self.checkBox_objs,self.checkBox_tags,self.checkBox_solution,self.checkBox_usages,self.checkBox_origin,self.checkBox_remark,self.checkBox_space] + for widget in self.ContnetCheckBoxList: + widget.setDisabled(True) + self.studentlayout() + self.disableusagessetting() + self.pushButton_exec.clicked.connect(self.saveandbuild) + self.pushButton_add.clicked.connect(self.additems) + self.pushButton_delete.clicked.connect(self.deleteitem) + self.pushButton_SelectPath.clicked.connect(self.selectpath) + self.radioButton_teacher.clicked.connect(self.teacherlayout) + self.radioButton_student.clicked.connect(self.studentlayout) + self.checkBox_usages.clicked.connect(self.toggleusagessetting) + self.radioButton_student.clicked.connect(self.toggleusagessetting) + self.radioButton_teacher.clicked.connect(self.toggleusagessetting) + def selectpath(self): + outputpath = QFileDialog.getExistingDirectory(self,"选择文件夹") + self.lineEdit_path.setText(outputpath) + def additems(self): + toAddString = self.plainTextEdit_newitems.toPlainText() + try: + toAddList = TitleIDStringtoTupleList(toAddString) + self.TitleID_list += toAddList.copy() + except: + print("待添加字符串格式有误, 请检查") + self.plainTextEdit_allitems.setPlainText(TitleIDTupleListtoString(self.TitleID_list)) + def deleteitem(self): + enum = int(self.lineEdit_index.text())-1 + self.TitleID_list.pop(enum) + self.plainTextEdit_allitems.setPlainText(TitleIDTupleListtoString(self.TitleID_list)) + + def disableusagessetting(self): + self.lineEdit_high.setDisabled(True) + self.lineEdit_low.setDisabled(True) + self.lineEdit_grades.setDisabled(True) + def enableusagessetting(self): + self.lineEdit_high.setEnabled(True) + self.lineEdit_low.setEnabled(True) + self.lineEdit_grades.setEnabled(True) + def toggleusagessetting(self): + if self.checkBox_usages.isChecked() and self.radioButton_teacher.isChecked(): + self.enableusagessetting() + else: + self.disableusagessetting() + def studentlayout(self): + for widget in self.TeachersCheckBoxList: + widget.setDisabled(True) + for widget in self.StudentsCheckBoxList: + widget.setEnabled(True) + + def teacherlayout(self): + for widget in self.StudentsCheckBoxList: + widget.setDisabled(True) + for widget in self.TeachersCheckBoxList: + widget.setEnabled(True) + def generate_usages(self): + high = self.lineEdit_high.text().strip() + low = self.lineEdit_low.text().strip() + if self.checkBox_usages.isChecked() == False: + return [-2,-2] + elif self.checkBox_usages.isChecked() and high == "" and low == "": + return [-1,-1] + else: + if high == "": + high = "0" + if low == "": + low = "0" + return [int(high),int(low)] + def saveandbuild(self): + if self.radioButton_teacher.isChecked() and self.checkBox_usages.isChecked() and not self.lineEdit_grades.text().strip() == "": + grades = self.lineEdit_grades.text().strip().split(",") + else: + grades = [] + # prodictpath = "../题库0.3/Problems.json" + # objdictpath = "../题库0.3/LessonObj.json" + # raw_pro_dict = load_dict(prodictpath) + # pro_dict = select_grade_from_pro_dict(raw_pro_dict,grades) + # obj_dict = load_dict(objdictpath) + configjson = { + "教师版": self.radioButton_teacher.isChecked(), + "字段显示设置": { + "题后空间": self.checkBox_space.isChecked(), + "课时目标": self.checkBox_objs.isChecked(), + "题目标签": self.checkBox_tags.isChecked(), + "答案": self.checkBox_ans.isChecked(), + "解答与提示": self.checkBox_solution.isChecked(), + "使用记录": self.generate_usages(), + "来源": self.checkBox_origin.isChecked(), + "备注": self.checkBox_remark.isChecked(), + "届别": grades + } + } + + notetitle = "选题编译" + outputdir = self.lineEdit_path.text() #输出文件的目录 + outputfilepath = os.path.join(outputdir,notetitle+".tex") + print("输出文件目录: %s\n输出文件名: %s"%(outputdir,notetitle+".tex")) + + latex_raw = ReadTextFile("模板文件/讲义模板.txt") + if configjson["教师版"] == True: + latex_raw = latex_raw.replace(r"学号\blank{50} \ 姓名\blank{80}","上海市控江中学") + + if sys.platform != "win32": #非win系统用默认字体 + latex_raw = re.sub(r"fontset[\s]*=[\s]*none","fontset = fandol",latex_raw) + latex_raw = re.sub(r"\\setCJKmainfont",r"% \\setCJKmainfont",latex_raw) + + bodystring = "\\tableofcontents\n\n\\newpage\n\n" + bodylist = [] + # problems_dict = configjson["标题与题号"] + starttime = time.time() + mydb = connect(hostname = "wwylss.synology.me", port = "13306", username="root", pwd="Wwy@0018705", db = "tikutest") + mycursor = mydb.cursor() + for p,IDs in self.TitleID_list: + currentbodystring = f"\\section{{{p}}}\n\\begin{{enumerate}}\n\n" + for id in generate_number_set(IDs): + currentbodystring += generateLaTeXBodyContentfromMariaDB(mycursor,id,configjson) + currentbodystring += "\\end{enumerate}" + bodylist.append(currentbodystring) + bodystring += "\n\n\\newpage\n\n".join(bodylist) + + midtime = time.time() + print(f"生成LaTeX文件所花时间: {midtime-starttime:.3f}秒") + + latex_data = StringSubstitute(r"<<[\s\S]*?待替换[\s\S]*?>>",latex_raw,(notetitle,bodystring)) #替换标题和bodystring + SaveTextFile(latex_data,outputfilepath) #保存.tex文件 + + if XeLaTeXCompile(outputdir,notetitle+".tex"): + print("编译成功") + else: + print("编译失败") + + endtime = time.time() + print(f"生成pdf文件所花时间: {endtime-midtime:.3f}秒") + self.close() + startfile(self.lineEdit_path.text()) + +if __name__ == '__main__': + app = QApplication([]) + windows = MyWindow() + windows.show() + app.exec() + diff --git a/工具v3/指定题号编译pdf.ui b/工具v3/指定题号编译pdf.ui new file mode 100644 index 00000000..cb28f8d4 --- /dev/null +++ b/工具v3/指定题号编译pdf.ui @@ -0,0 +1,369 @@ + + + Form + + + + 0 + 0 + 890 + 361 + + + + 指定题号编译 + + + + + 660 + 220 + 221 + 131 + + + + + true + + + + 开始生成与编译 + + + + + + 390 + 20 + 61 + 16 + + + + 文件路径 + + + + + + 390 + 40 + 491 + 20 + + + + + + + 800 + 10 + 81 + 24 + + + + 选择路径 + + + + + + 390 + 80 + 81 + 271 + + + + + + + 版式选择 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + 学生版 + + + true + + + + + + + 教师版 + + + + + + + + + 490 + 80 + 151 + 271 + + + + + + + 内容选项 + + + + + + + 题后空间 + + + + + + + 答案 + + + + + + + 课时目标 + + + true + + + false + + + + + + + 题目标签 + + + + + + + 解答与提示 + + + + + + + 使用记录 + + + + + + + 来源 + + + + + + + 备注 + + + + + + + + + 660 + 80 + 222 + 121 + + + + + + + 使用记录选择(都留空为全显示) + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + 届别选择(用 "," 分隔, 留空为全显示) + + + + + + + + + + + + 10 + 160 + 371 + 191 + + + + + + + 10 + 140 + 54 + 16 + + + + 题号列表 + + + + + + 11 + 11 + 60 + 16 + + + + 标题与题号 + + + + + + 10 + 30 + 371 + 71 + + + + 如: 集合: 2:30,32 或 "集合": "2:30", "函数": "5,60,71:75"(可有回车) + + + + + + 90 + 110 + 241 + 28 + + + + + + + 添加一项或多项 + + + + + + + + + 删去一项 + + + + + + + + + + 20 + 16777215 + + + + + + + + + + + + 20 + 16777215 + + + + + + + + + 20 + 16777215 + + + + + + + + + + + + + + + + +