From 8f1b409eddb243ce171d2189047dabf58feba8c4 Mon Sep 17 00:00:00 2001 From: "weiye.wang" Date: Mon, 15 Apr 2024 22:54:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=AD=A3=E7=A1=AE=E7=8E=87?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E9=A2=98=E5=8F=B7=E5=8A=9F=E8=83=BD=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=87=B3=E5=B7=A5=E5=85=B7v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 工具v3/Ui_根据正确率选择题号.py | 148 ++++++++++++++++++++ 工具v3/database_tools_2.py | 31 +++-- 工具v3/根据正确率选择题号.py | 44 ++++++ 工具v3/根据正确率选择题号.ui | 236 ++++++++++++++++++++++++++++++++ 4 files changed, 447 insertions(+), 12 deletions(-) create mode 100644 工具v3/Ui_根据正确率选择题号.py create mode 100644 工具v3/根据正确率选择题号.py create mode 100644 工具v3/根据正确率选择题号.ui diff --git a/工具v3/Ui_根据正确率选择题号.py b/工具v3/Ui_根据正确率选择题号.py new file mode 100644 index 00000000..8ebf7cf6 --- /dev/null +++ b/工具v3/Ui_根据正确率选择题号.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file '根据正确率选择题号.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, QLabel, QLineEdit, QPlainTextEdit, + QPushButton, QSizePolicy, QVBoxLayout, QWidget) + +class Ui_widget(object): + def setupUi(self, widget): + if not widget.objectName(): + widget.setObjectName(u"widget") + widget.resize(411, 507) + self.verticalLayoutWidget = QWidget(widget) + self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget") + self.verticalLayoutWidget.setGeometry(QRect(10, 20, 91, 92)) + self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setObjectName(u"verticalLayout") + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.label = QLabel(self.verticalLayoutWidget) + self.label.setObjectName(u"label") + + self.verticalLayout.addWidget(self.label) + + self.lineEdit_startdate = QLineEdit(self.verticalLayoutWidget) + self.lineEdit_startdate.setObjectName(u"lineEdit_startdate") + + self.verticalLayout.addWidget(self.lineEdit_startdate) + + self.label_2 = QLabel(self.verticalLayoutWidget) + self.label_2.setObjectName(u"label_2") + + self.verticalLayout.addWidget(self.label_2) + + self.lineEdit_enddate = QLineEdit(self.verticalLayoutWidget) + self.lineEdit_enddate.setObjectName(u"lineEdit_enddate") + + self.verticalLayout.addWidget(self.lineEdit_enddate) + + self.verticalLayoutWidget_2 = QWidget(widget) + self.verticalLayoutWidget_2.setObjectName(u"verticalLayoutWidget_2") + self.verticalLayoutWidget_2.setGeometry(QRect(110, 20, 91, 92)) + self.verticalLayout_2 = QVBoxLayout(self.verticalLayoutWidget_2) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) + self.label_3 = QLabel(self.verticalLayoutWidget_2) + self.label_3.setObjectName(u"label_3") + + self.verticalLayout_2.addWidget(self.label_3) + + self.lineEdit_lowerbound = QLineEdit(self.verticalLayoutWidget_2) + self.lineEdit_lowerbound.setObjectName(u"lineEdit_lowerbound") + + self.verticalLayout_2.addWidget(self.lineEdit_lowerbound) + + self.label_4 = QLabel(self.verticalLayoutWidget_2) + self.label_4.setObjectName(u"label_4") + + self.verticalLayout_2.addWidget(self.label_4) + + self.lineEdit_upperbound = QLineEdit(self.verticalLayoutWidget_2) + self.lineEdit_upperbound.setObjectName(u"lineEdit_upperbound") + + self.verticalLayout_2.addWidget(self.lineEdit_upperbound) + + self.verticalLayoutWidget_3 = QWidget(widget) + self.verticalLayoutWidget_3.setObjectName(u"verticalLayoutWidget_3") + self.verticalLayoutWidget_3.setGeometry(QRect(210, 20, 91, 92)) + self.verticalLayout_3 = QVBoxLayout(self.verticalLayoutWidget_3) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) + self.label_5 = QLabel(self.verticalLayoutWidget_3) + self.label_5.setObjectName(u"label_5") + self.label_5.setMaximumSize(QSize(16777215, 20)) + + self.verticalLayout_3.addWidget(self.label_5) + + self.lineEdit_classregex = QLineEdit(self.verticalLayoutWidget_3) + self.lineEdit_classregex.setObjectName(u"lineEdit_classregex") + + self.verticalLayout_3.addWidget(self.lineEdit_classregex) + + self.pushButton_exec = QPushButton(widget) + self.pushButton_exec.setObjectName(u"pushButton_exec") + self.pushButton_exec.setGeometry(QRect(310, 20, 91, 91)) + font = QFont() + font.setBold(True) + self.pushButton_exec.setFont(font) + self.label_6 = QLabel(widget) + self.label_6.setObjectName(u"label_6") + self.label_6.setGeometry(QRect(10, 120, 54, 16)) + self.plainTextEdit_ids = QPlainTextEdit(widget) + self.plainTextEdit_ids.setObjectName(u"plainTextEdit_ids") + self.plainTextEdit_ids.setGeometry(QRect(10, 140, 391, 81)) + self.plainTextEdit_ids.setReadOnly(True) + self.label_7 = QLabel(widget) + self.label_7.setObjectName(u"label_7") + self.label_7.setGeometry(QRect(10, 230, 141, 16)) + self.plainTextEdit_cautionids = QPlainTextEdit(widget) + self.plainTextEdit_cautionids.setObjectName(u"plainTextEdit_cautionids") + self.plainTextEdit_cautionids.setGeometry(QRect(10, 250, 391, 81)) + self.plainTextEdit_cautionids.setReadOnly(True) + self.label_8 = QLabel(widget) + self.label_8.setObjectName(u"label_8") + self.label_8.setGeometry(QRect(10, 340, 54, 16)) + self.plainTextEdit_subproblems = QPlainTextEdit(widget) + self.plainTextEdit_subproblems.setObjectName(u"plainTextEdit_subproblems") + self.plainTextEdit_subproblems.setGeometry(QRect(10, 360, 391, 131)) + self.plainTextEdit_subproblems.setReadOnly(True) + + self.retranslateUi(widget) + + QMetaObject.connectSlotsByName(widget) + # setupUi + + def retranslateUi(self, widget): + widget.setWindowTitle(QCoreApplication.translate("widget", u"\u6839\u636e\u6b63\u786e\u7387\u9009\u62e9\u9898\u53f7", None)) + self.label.setText(QCoreApplication.translate("widget", u"\u8d77\u59cb\u65e5\u671f", None)) + self.lineEdit_startdate.setPlaceholderText(QCoreApplication.translate("widget", u"yyyymmdd", None)) + self.label_2.setText(QCoreApplication.translate("widget", u"\u7ec8\u6b62\u65e5\u671f", None)) + self.lineEdit_enddate.setText("") + self.lineEdit_enddate.setPlaceholderText(QCoreApplication.translate("widget", u"yyyymmdd", None)) + self.label_3.setText(QCoreApplication.translate("widget", u"\u6b63\u786e\u7387\u4e0b\u754c", None)) + self.lineEdit_lowerbound.setPlaceholderText(QCoreApplication.translate("widget", u"\u5982: 0.5", None)) + self.label_4.setText(QCoreApplication.translate("widget", u"\u6b63\u786e\u7387\u4e0a\u754c", None)) + self.lineEdit_upperbound.setText("") + self.lineEdit_upperbound.setPlaceholderText(QCoreApplication.translate("widget", u"\u5982: 0.73", None)) + self.label_5.setText(QCoreApplication.translate("widget", u"\u73ed\u7ea7\u6b63\u5219\u8868\u8fbe\u5f0f", None)) + self.lineEdit_classregex.setText("") + self.lineEdit_classregex.setPlaceholderText(QCoreApplication.translate("widget", u"\u5982: 2026", None)) + self.pushButton_exec.setText(QCoreApplication.translate("widget", u"\u751f\u6210\u5217\u8868", None)) + self.label_6.setText(QCoreApplication.translate("widget", u"\u9898\u53f7", None)) + self.label_7.setText(QCoreApplication.translate("widget", u"\u4f7f\u7528\u8bb0\u5f55\u957f\u5ea6\u4e0d\u4e00\u81f4\u9898\u53f7", None)) + self.label_8.setText(QCoreApplication.translate("widget", u"\u5173\u6ce8\u5c0f\u9898", None)) + # retranslateUi + diff --git a/工具v3/database_tools_2.py b/工具v3/database_tools_2.py index 94f59c72..64b7d74c 100644 --- a/工具v3/database_tools_2.py +++ b/工具v3/database_tools_2.py @@ -2381,24 +2381,30 @@ def RefineExclude(excludejson): #将excludejson的key变为6位题号 return newjson -def ChooseIDsByUsageInterval(startdate,enddate,interval,classregex,prodict): #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号 - used_problems = [] - for id in prodict: - currentproblem = prodict[id] - currentusages = [parseUsage(u) for u in currentproblem["usages"] if startdate <= parseUsage(u)["date"] <= enddate and re.findall(classregex,parseUsage(u)["classid"])!=[]] - if not currentusages == []: - used_problems.append((id,currentusages)) +def ChooseIDsByUsageInterval(startdate,enddate,interval,classregex): #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号 + validusages = [] + usedproblems = [] + mydb = connect(hostname = "wwylss.synology.me", port = "13306", username="root", pwd="Wwy@0018705", db = "tikutest") + mycursor = mydb.cursor() + sql = "SELECT ID,date,classname,diff FROM usages;" + mycursor.execute(sql) + usage_list = mycursor.fetchall() + for id,date,classname,diff_raw in usage_list: + if not date is None and startdate <= date <= enddate and re.findall(classregex,classname) != []: + validusages.append((id,date,classname,json.loads(diff_raw))) + if not id in usedproblems: + usedproblems.append(id) cautionids = [] #使用记录长度不一的题目id chosenproblems = {} #使用记录的平均值在thresholds中的题目id(键值为题号id, 内容为小题号, 内容为空表示没有小题) - for item in used_problems: - id,usages = item - subproblems = [u["subproblems"] for u in usages] + for id in usedproblems: + usages = [u[1:] for u in validusages if u[0] == id] + subproblems = [len(u[2]) for u in usages] if max(subproblems) != min(subproblems): cautionids.append(id) print(f"!!! 题号 {id} 的使用记录中小题数目不全相同, 请检查") else: for i in range(subproblems[0]): - difflist = [u["difficulties"][i] for u in usages] + difflist = [float(u[2][i]) for u in usages] diffmean = np.mean(difflist) if interval[0] <= diffmean <= interval[1]: if subproblems[0] == 1: @@ -2407,7 +2413,8 @@ def ChooseIDsByUsageInterval(startdate,enddate,interval,classregex,prodict): # chosenproblems[id] = [i+1] else: chosenproblems[id].append(i+1) - return (chosenproblems,cautionids,used_problems) #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号 + mydb.close() + return (chosenproblems,cautionids,usedproblems) #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号 if __name__ == "__main__": diff --git a/工具v3/根据正确率选择题号.py b/工具v3/根据正确率选择题号.py new file mode 100644 index 00000000..ca94156c --- /dev/null +++ b/工具v3/根据正确率选择题号.py @@ -0,0 +1,44 @@ +from PySide6.QtWidgets import QWidget, QApplication, QFileDialog +from Ui_根据正确率选择题号 import Ui_widget +from database_tools_2 import * + +class MyWindow(QWidget,Ui_widget): + def __init__(self): + super().__init__() + self.setupUi(self) + self.bind() + + def bind(self): + self.pushButton_exec.clicked.connect(self.exec) + + + def exec(self): + startdate = self.lineEdit_startdate.text() + enddate = self.lineEdit_enddate.text() + interval = [float(self.lineEdit_lowerbound.text()),float(self.lineEdit_upperbound.text())] + classregex = self.lineEdit_classregex.text() + chosendict,cautionlist,usedlist = ChooseIDsByUsageInterval(startdate,enddate,interval,classregex) + self.plainTextEdit_ids.setPlainText(generate_exp(list(chosendict.keys()))) + self.plainTextEdit_cautionids.setPlainText(generate_exp(cautionlist)) + subp_output = "" + for id in chosendict.keys(): + if chosendict[id] != []: + subp_output += f"题号 {id}: " + for s in chosendict[id]: + subp_output += f"第 ({s}) 小题 " + subp_output += "\n" + self.plainTextEdit_subproblems.setPlainText(subp_output) + + + + + + + + +if __name__ == '__main__': + app = QApplication([]) + windows = MyWindow() + windows.show() + app.exec() + diff --git a/工具v3/根据正确率选择题号.ui b/工具v3/根据正确率选择题号.ui new file mode 100644 index 00000000..edbda34b --- /dev/null +++ b/工具v3/根据正确率选择题号.ui @@ -0,0 +1,236 @@ + + + widget + + + + 0 + 0 + 411 + 507 + + + + 根据正确率选择题号 + + + + + 10 + 20 + 91 + 92 + + + + + + + 起始日期 + + + + + + + yyyymmdd + + + + + + + 终止日期 + + + + + + + + + + yyyymmdd + + + + + + + + + 110 + 20 + 91 + 92 + + + + + + + 正确率下界 + + + + + + + 如: 0.5 + + + + + + + 正确率上界 + + + + + + + + + + 如: 0.73 + + + + + + + + + 210 + 20 + 91 + 92 + + + + + + + + 16777215 + 20 + + + + 班级正则表达式 + + + + + + + + + + 如: 2026 + + + + + + + + + 310 + 20 + 91 + 91 + + + + + true + + + + 生成列表 + + + + + + 10 + 120 + 54 + 16 + + + + 题号 + + + + + + 10 + 140 + 391 + 81 + + + + true + + + + + + 10 + 230 + 141 + 16 + + + + 使用记录长度不一致题号 + + + + + + 10 + 250 + 391 + 81 + + + + true + + + + + + 10 + 340 + 54 + 16 + + + + 关注小题 + + + + + + 10 + 360 + 391 + 131 + + + + true + + + + + +