根据正确率选择题号功能迁移至工具v3

This commit is contained in:
weiye.wang 2024-04-15 22:54:07 +08:00
parent 4eb43ab93e
commit 8f1b409edd
4 changed files with 447 additions and 12 deletions

View File

@ -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

View File

@ -2381,24 +2381,30 @@ def RefineExclude(excludejson): #将excludejson的key变为6位题号
return newjson return newjson
def ChooseIDsByUsageInterval(startdate,enddate,interval,classregex,prodict): #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号 def ChooseIDsByUsageInterval(startdate,enddate,interval,classregex): #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号
used_problems = [] validusages = []
for id in prodict: usedproblems = []
currentproblem = prodict[id] mydb = connect(hostname = "wwylss.synology.me", port = "13306", username="root", pwd="Wwy@0018705", db = "tikutest")
currentusages = [parseUsage(u) for u in currentproblem["usages"] if startdate <= parseUsage(u)["date"] <= enddate and re.findall(classregex,parseUsage(u)["classid"])!=[]] mycursor = mydb.cursor()
if not currentusages == []: sql = "SELECT ID,date,classname,diff FROM usages;"
used_problems.append((id,currentusages)) 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 cautionids = [] #使用记录长度不一的题目id
chosenproblems = {} #使用记录的平均值在thresholds中的题目id(键值为题号id, 内容为小题号, 内容为空表示没有小题) chosenproblems = {} #使用记录的平均值在thresholds中的题目id(键值为题号id, 内容为小题号, 内容为空表示没有小题)
for item in used_problems: for id in usedproblems:
id,usages = item usages = [u[1:] for u in validusages if u[0] == id]
subproblems = [u["subproblems"] for u in usages] subproblems = [len(u[2]) for u in usages]
if max(subproblems) != min(subproblems): if max(subproblems) != min(subproblems):
cautionids.append(id) cautionids.append(id)
print(f"!!! 题号 {id} 的使用记录中小题数目不全相同, 请检查") print(f"!!! 题号 {id} 的使用记录中小题数目不全相同, 请检查")
else: else:
for i in range(subproblems[0]): 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) diffmean = np.mean(difflist)
if interval[0] <= diffmean <= interval[1]: if interval[0] <= diffmean <= interval[1]:
if subproblems[0] == 1: if subproblems[0] == 1:
@ -2407,7 +2413,8 @@ def ChooseIDsByUsageInterval(startdate,enddate,interval,classregex,prodict): #
chosenproblems[id] = [i+1] chosenproblems[id] = [i+1]
else: else:
chosenproblems[id].append(i+1) chosenproblems[id].append(i+1)
return (chosenproblems,cautionids,used_problems) #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号 mydb.close()
return (chosenproblems,cautionids,usedproblems) #返回根据条件选出的题号字典及对应小题, 需要留意的记录长度不一的题号, 以及所有使用过的题号
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -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()

View File

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>widget</class>
<widget class="QWidget" name="widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>411</width>
<height>507</height>
</rect>
</property>
<property name="windowTitle">
<string>根据正确率选择题号</string>
</property>
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>91</width>
<height>92</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>起始日期</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_startdate">
<property name="placeholderText">
<string>yyyymmdd</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>终止日期</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_enddate">
<property name="text">
<string/>
</property>
<property name="placeholderText">
<string>yyyymmdd</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="verticalLayoutWidget_2">
<property name="geometry">
<rect>
<x>110</x>
<y>20</y>
<width>91</width>
<height>92</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>正确率下界</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_lowerbound">
<property name="placeholderText">
<string>如: 0.5</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>正确率上界</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_upperbound">
<property name="text">
<string/>
</property>
<property name="placeholderText">
<string>如: 0.73</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="verticalLayoutWidget_3">
<property name="geometry">
<rect>
<x>210</x>
<y>20</y>
<width>91</width>
<height>92</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label_5">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>班级正则表达式</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_classregex">
<property name="text">
<string/>
</property>
<property name="placeholderText">
<string>如: 2026</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QPushButton" name="pushButton_exec">
<property name="geometry">
<rect>
<x>310</x>
<y>20</y>
<width>91</width>
<height>91</height>
</rect>
</property>
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>生成列表</string>
</property>
</widget>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>10</x>
<y>120</y>
<width>54</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>题号</string>
</property>
</widget>
<widget class="QPlainTextEdit" name="plainTextEdit_ids">
<property name="geometry">
<rect>
<x>10</x>
<y>140</y>
<width>391</width>
<height>81</height>
</rect>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>10</x>
<y>230</y>
<width>141</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>使用记录长度不一致题号</string>
</property>
</widget>
<widget class="QPlainTextEdit" name="plainTextEdit_cautionids">
<property name="geometry">
<rect>
<x>10</x>
<y>250</y>
<width>391</width>
<height>81</height>
</rect>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="label_8">
<property name="geometry">
<rect>
<x>10</x>
<y>340</y>
<width>54</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>关注小题</string>
</property>
</widget>
<widget class="QPlainTextEdit" name="plainTextEdit_subproblems">
<property name="geometry">
<rect>
<x>10</x>
<y>360</y>
<width>391</width>
<height>131</height>
</rect>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>