from PySide6.QtWidgets import QWidget, QApplication, QFileDialog, QTableWidgetItem from PySide6.QtGui import QColor from Ui_获取小闲平台使用数据new import Ui_Form from database_tools_2 import * import shutil,zipfile def getFilename(string): filename = re.findall(r"\d{21}_([\s\S]*?)_高[一二三]_数学",string)[0] return filename def getDate(string): date = re.findall(r"\((\d{8})\).zip",string) if len(date) > 0: return date[0] else: return "" class MyWindow(QWidget,Ui_Form): def __init__(self): super().__init__() self.setupUi(self) self.bind() def bind(self): self.tempdir = "临时文件/zips" self.statsfilename = "小题分_按学号(数学).xlsx" self.answersheetseekingpath = "../备课组" self.lineEdit_threshold.setText("0.75") self.tableWidget.setColumnWidth(0,200) self.tableWidget.setColumnWidth(1,280) self.tableWidget.setColumnWidth(2,80) self.pushButton_file.clicked.connect(self.getFilePath) self.pushButton_folder.clicked.connect(self.getDirPath) self.pushButton_validcheck.clicked.connect(self.checkpathanddate) self.pushButton_exec.clicked.connect(self.exec) self.tablevalid = True def getFilePath(self): #选取文件并放置在tableWidget的第一行 self.tableWidget.setRowCount(1) pathlist = QFileDialog.getOpenFileName(self,"选择文件",".","zip文件(*.zip);;所有文件(*)") self.zipfilepath = pathlist[0] self.tableWidget.setItem(0,0,QTableWidgetItem(pathlist[0])) # self.singlefile = True filename = getFilename(pathlist[0]) self.tableWidget.setItem(0,1,QTableWidgetItem(filename)) self.tableWidget.setItem(0,2,QTableWidgetItem(getDate(pathlist[0]))) def getDirPath(self): #选取文件夹中的所有符合答题纸特征的.zip文件并放置在tableWidget中 dirpath = QFileDialog.getExistingDirectory(self,"选择文件夹") self.filelist = [os.path.join(dirpath,f) for f in os.listdir(dirpath) if ".zip" in f and re.findall(r"\d{21}",f)!=[]] # self.singlefile = False count = 0 for f in self.filelist: if count + 1 > self.tableWidget.rowCount(): self.tableWidget.insertRow(self.tableWidget.rowCount()) self.tableWidget.setItem(count,0,QTableWidgetItem(f)) self.tableWidget.setItem(count,1,QTableWidgetItem(getFilename(f))) self.tableWidget.setItem(count,2,QTableWidgetItem(getDate(f))) count += 1 def checkpathanddate(self): #检查文件名和日期是否有效, 文件名无效标黄色, 日期无效标红色 if not float(self.lineEdit_threshold.text()) >= 0 or not float(self.lineEdit_threshold.text()) <= 1: self.lineEdit_threshold.setStyleSheet("background-color: red;") self.tablevalid = False self.using_rows = [] self.tableWidget.clearSelection() for t in range(self.tableWidget.rowCount()): for i in range(3): self.tableWidget.item(t,i).setBackground(QColor("transparent")) for t in range(self.tableWidget.rowCount()): if re.findall(r"\d{21}",self.tableWidget.item(t,0).text()) == [] or not len(self.tableWidget.item(t,2).text().strip()) == 8: for i in range(3): self.tableWidget.item(t,i).setBackground(QColor("yellow")) else: self.using_rows.append(t) for row in range(self.tableWidget.rowCount()): date = self.tableWidget.item(row,2).text() if not len(date.strip()) == 8: self.tableWidget.item(row,2).setBackground(QColor("red")) def exec(self): #执行操作并将使用数据汇入metadata.txt self.checkpathanddate() if len(self.using_rows) >= 2: SaveTextFile("","文本文件/metadata.txt") for row in self.using_rows: date = self.tableWidget.item(row,2).text() threshold = float(self.lineEdit_threshold.text()) output = self.generateUsingInfo(zipfilepath=self.tableWidget.item(row,0).text(),threshold=threshold,date=date) if output == 1 or CheckUsagesValidity(output) != 0: for i in range(3): self.tableWidget.item(row,i).setBackground(QColor("red")) if output == 1: print(f"{self.tableWidget.item(row,1).text()} 有问题, 未能生成使用数据") else: print(f"{self.tableWidget.item(row,1).text()} 满分设置有误, 请检查") else: for i in range(3): self.tableWidget.item(row,i).setBackground(QColor("green")) print(f"{self.tableWidget.item(row,1).text()} 使用数据生成成功") if not self.checkBox.isChecked() and len(self.using_rows) == 1: SaveTextFile(output,"文本文件/metadata.txt") else: AppendTextFile(output,"文本文件/metadata.txt") os.system("code 文本文件/metadata.txt") def generateUsingInfo(self,zipfilepath,threshold,date): #根据zipfilepath文件路径, threshold最低提交比例阈值, date日期产生对应一张答题纸的使用记录 try: shutil.rmtree(self.tempdir) except: pass makedir(self.tempdir) try: xiaoxianpid = ParseZipname(zipfilepath) paperinfo = FindPaper(xiaoxianpid, self.answersheetseekingpath) gradename = paperinfo[1] idlist = paperinfo[2] excludejson = paperinfo[4] print(paperinfo) # print(paperinfo) zf = zipfile.ZipFile(zipfilepath) zf.extractall(self.tempdir) #解压zip文件中的所有内容到tempdir # # papertype = CheckPaperType(tempdir,statsfilename) statsfilepathlist = FindFile(self.tempdir,self.statsfilename) validcols,marks = generateColIndexandMarks(statsfilepathlist,self.statsfilename,paperinfo) dfcurrent = pd.read_excel(os.path.join(statsfilepathlist[0],self.statsfilename)) correspondence_dict = generateIDtoUsageCorrespondence(idlist,validcols,dfcurrent.iloc[1,validcols]) output = CalculateUsages(statsfilepathlist,self.statsfilename,gradename,threshold,marks,correspondence_dict,validcols,date,exclude=RefineExclude(excludejson)) return output #返回由usages开始的使用记录文本 except: return 1 #无法生成就返回1 if __name__ == '__main__': app = QApplication([]) windows = MyWindow() windows.show() app.exec()