parser.add_argument('-f', '--force', action="store_true", help='force update') parser.add_argument('-o', '--only', action="store", default=None, help='update only, use it after -f/-force') parser.add_argument('-a', '--add', action="store_true", help='add domain name to database') parser.add_argument('-d', '--delete', action="store_true", help='remove domain name from database') parser.add_argument('-ls', '--list', action="store_true", help='print all the domain names from database') args = parser.parse_args() if args.force: Process.do(force=True, only=args.only) elif args.add: db.add() elif args.delete: db.delete() elif args.list: db.domainlist() else: Process.do()
class Controller(QMainWindow, Ui_MainWindow): def __init__(self): #init QMainWindow.__init__(self) Ui_MainWindow.__init__(self) Ui_GenerateDocConfirm.__init__(self) Ui_databaseSetting.__init__(self) Ui_WordPad.__init__(self) self.setupUi(self) #connect self.initToolBar() self.connectButton() self.connectText() self.connectList() #message dialog self.msgDialog = MessageDialog() #graph style self.setupVars() # use wordPad self.connectWordPad() #sample dir self.init_Samples() def setupVars(self): self.writeDocLock = threading.RLock() self.currentSelectedFile = set() self.currentSelectedFile_temp = set() self.graphStyle = getGraphStyle() self.wpc = None def init_DB_user(self): #database self.db = DB() if not self.db.checkConnection(): self.msgDialog.showErrorDialog( "初始化数据库出错", "数据库无法连接,请检查相应配置!\n异常信息为:" + self.db.dbException + "\n您做的任何变动将无法存入数据库!") # search content completer self.getCompanyInfo() #userInit self.user = userInfo() self.refreshDepartmentList() if self.user.color == "": self.user.color = json.dumps(self.graphStyle) self.setupLevelFileList() #UI日期默认当前日期 dateReg = re.compile( r"^(?P<year>\d{4})[\u4e00-\u9fa5](?P<month>\d{2})[\u4e00-\u9fa5](?P<day>\d{2})[\u4e00-\u9fa5]$" ) date1 = dateReg.match(self.user.releaseDate) date2 = dateReg.match(self.user.auditDate) self.releaseDateText.setDate( QDate(int(date1.group("year")), int(date1.group("month")), int(date1.group("day")))) self.auditDateText.setDate( QDate(int(date2.group("year")), int(date2.group("month")), int(date2.group("day")))) def init_Samples(self): self.pathSelector = pathSelection() def initToolBar(self): self.tabWidget_2.setStyleSheet( "QTabBar::tab { height: 50px; width: 120px; font-size: 9pt;}") self.tabWidget.setStyleSheet( "QTabBar::tab { height: 28px !important; width: 110px !important; }" ) self.tabWidget_3.setStyleSheet( "QTabBar::tab { height: 28px !important; width: 110px !important; }" ) self.tabWidget_4.setStyleSheet( "QTabBar::tab { height: 28px !important; width: 150px !important; }" ) tool = self.addToolBar("设置") edit0 = QAction(QIcon(""), "数据库配置", self) edit0.setToolTip("数据库的配置信息") tool.addAction(edit0) edit1 = QAction(QIcon(""), "重置数据库", self) edit1.setToolTip("该操作将清空当前数据库并重置所有数据表") tool.addAction(edit1) edit2 = QAction(QIcon(""), "更新文件列表", self) edit2.setToolTip("手动更新模板文件列表") tool.addAction(edit2) edit3 = QAction(QIcon(""), "帮助", self) edit3.setToolTip("帮助及版本信息") tool.addAction(edit3) tool.actionTriggered.connect(self.toolBtnPressed) def connectText(self): self.Page_level1_ConnectText() self.Page_level2_ConnectText() self.Page_level3_ConnectText() def Page_level1_ConnectText(self): self.fileNameText.textChanged.connect(lambda: self.setUser()) self.companyText.textChanged.connect(lambda: self.setUser()) self.addressText.textChanged.connect(lambda: self.setUser()) self.coverFieldText.textChanged.connect(lambda: self.setUser()) self.managerText.textChanged.connect(lambda: self.setUser()) self.guandaiText.textChanged.connect(lambda: self.setUser()) self.compilerText.textChanged.connect(lambda: self.setUser()) self.approverText.textChanged.connect(lambda: self.setUser()) self.auditText.textChanged.connect(lambda: self.setUser()) self.announcerText.textChanged.connect(lambda: self.setUser()) self.zipText.textChanged.connect(lambda: self.setUser()) self.phoneText.textChanged.connect(lambda: self.setUser()) self.policyText.textChanged.connect(lambda: self.setUser()) self.introductionText.textChanged.connect(lambda: self.setUser()) self.corporateText.textChanged.connect(lambda: self.setUser()) self.releaseDateText.dateChanged.connect(lambda: self.setUser()) self.auditDateText.dateChanged.connect(lambda: self.setUser()) # logo self.Logo.textChanged.connect(lambda: self.showLogo()) # style self.level1Width.valueChanged.connect( lambda: self.setLineWidth(self.level1Width, 0)) self.level2Width.valueChanged.connect( lambda: self.setLineWidth(self.level2Width, 1)) self.level3Width.valueChanged.connect( lambda: self.setLineWidth(self.level3Width, 2)) self.level4Width.valueChanged.connect( lambda: self.setLineWidth(self.level4Width, 3)) def Page_level2_ConnectText(self): self.level2_fileList.setAnimated(True) self.level2_fileList.setSelectionMode( QAbstractItemView.ExtendedSelection) self.level2_fileList.itemChanged.connect(self.level2FileChangeHandler) def Page_level3_ConnectText(self): self.level3_fileList.setAnimated(True) self.level3_fileList.setSelectionMode( QAbstractItemView.ExtendedSelection) self.level3_fileList.itemChanged.connect(self.level3FileChangeHandler) def connectButton(self): #deStructBorderColor self.level1Border.clicked.connect( lambda: self.setGraphColor(self.level1Border, 0, "fillcolor")) self.level2Border.clicked.connect( lambda: self.setGraphColor(self.level2Border, 1, "fillcolor")) self.level3Border.clicked.connect( lambda: self.setGraphColor(self.level3Border, 2, "fillcolor")) self.level4Border.clicked.connect( lambda: self.setGraphColor(self.level4Border, 3, "fillcolor")) #deStructFontColor self.level1Font.clicked.connect( lambda: self.setGraphColor(self.level1Font, 0, "fontcolor")) self.level2Font.clicked.connect( lambda: self.setGraphColor(self.level2Font, 1, "fontcolor")) self.level3Font.clicked.connect( lambda: self.setGraphColor(self.level3Font, 2, "fontcolor")) self.level4Font.clicked.connect( lambda: self.setGraphColor(self.level4Font, 3, "fontcolor")) #DateChoose self.auditDateText.setCalendarPopup(True) self.releaseDateText.setCalendarPopup(True) #LogoChoose self.logoChooseButton.clicked.connect(lambda: self.chooseLogo()) #previewButton self.previewButton.clicked.connect(lambda: self.showPreviewGraph()) #generateDoc self.createBotton.clicked.connect(lambda: self.generateDoc()) self.newUserButton.clicked.connect(lambda: self.newUser()) self.saveButton.clicked.connect(lambda: self.saveInfoButNotGen()) #search self.searchButton.clicked.connect(lambda: self.search()) def openPadAction(self, name): wordpad = QAction(QIcon(""), "打开写字板", self) wordpad.triggered.connect(lambda: self.openWordPad(name)) ctrlC = QAction(QIcon(""), "复制", self) ctrlC.setShortcut("Ctrl+C") ctrlC.triggered.connect(self.__dict__[name].copy) ctrlV = QAction(QIcon(""), "粘贴", self) ctrlV.setShortcut("Ctrl+V") ctrlV.triggered.connect(self.__dict__[name].paste) ctrlX = QAction(QIcon(""), "剪切", self) ctrlX.setShortcut("Ctrl+X") ctrlX.triggered.connect(self.__dict__[name].cut) ctrlA = QAction(QIcon(""), "全选", self) ctrlA.setShortcut("Ctrl+A") ctrlA.triggered.connect(self.__dict__[name].selectAll) return [wordpad, ctrlC, ctrlV, ctrlX, ctrlA] def connectWordPad(self): for k, v in self.__dict__.items(): if isinstance(v, QLineEdit) or isinstance(v, QPlainTextEdit): actionList = self.openPadAction(k) for act in actionList: self.__dict__[k].addAction(act) self.__dict__[k].setContextMenuPolicy(Qt.ActionsContextMenu) def connectList(self): #连接一层department列表 self.connectDepartmentList() #连接四层project列表 self.connectProjectList() def connectDepartmentList(self): #可能没选中,故用getattr确认 self.departmentList.currentItemChanged.connect( lambda: self.showDepartmentDetail( getattr(self.departmentList.currentItem(), 'text', str)())) # button self.AddDep.clicked.connect(lambda: self.addDepartment()) #可能没选中,故用getattr确认 self.DeleteDep.clicked.connect(lambda: self.removeDepartment( getattr(self.departmentList.currentItem(), 'text', str)())) self.cancelDep.clicked.connect(lambda: self.showDepartmentDetail( getattr(self.departmentList.currentItem(), 'text', str)())) self.addOrModifyDep.clicked.connect(lambda: self.setDepartments( getattr(self.departmentList.currentItem(), 'text', str)())) def chooseLogo(self): fileName1, filetype = QFileDialog().getOpenFileName( self, "选取图标", ".//", "Images(*.png *.jpg *.jpeg *.bmp)") self.Logo.setPlainText(fileName1) def showLogo(self): logoPath = self.Logo.toPlainText() reg = "(file:///)?(.*)" path = re.search(reg, logoPath, re.M | re.I).group(2) image = QImage() #print(path) if path == None or path == "": scene = QGraphicsScene() self.logoView.setScene(scene) self.logoView.show() elif path and image.load(path): filepath, filename = os.path.split(path) if not os.path.exists("./logoData"): os.makedirs("./logoData") tarDir = "./logoData/" + filename if not os.path.exists(tarDir): tarDir = "./logoData/%s_%s" % (self.user.company, filename) try: shutil.copy(path, tarDir) except Exception as e: shutil.move(path, tarDir) image = image.scaledToHeight(self.logoView.height()) scene = QGraphicsScene() scene.addPixmap(QPixmap.fromImage(image)) self.logoView.setScene(scene) self.logoView.show() #save self.user.logoPath = tarDir def toolBtnPressed(self, qaction): if qaction.text() == "数据库配置": if self.resetDB(): self.db.refreshConnection() if self.db.checkConnection(): self.msgDialog.showInformationDialog("提示", "数据库配置更改成功!") self.getCompanyInfo() else: self.msgDialog.showErrorDialog( "初始化数据库出错", "数据库无法连接,请检查相应配置!\n异常信息为:" + self.db.dbException + "\n您做的任何变动将无法存入数据库!") elif qaction.text() == "重置数据库": self.msgDialog.showWarningDialogWithMethod("风险警告", "重置数据库有风险,请谨慎操作!", self.cleanDB) elif qaction.text() == "更新文件列表": self.updateLevelFileList() elif qaction.text() == "帮助": self.showTips() def showTips(self): with open("config/help.json", "r") as f: obj = json.load(f) self.msgDialog.showInformationDialog( "帮助", obj["help"] + "\n" + "版本:" + obj["version"]) def openWordPad(self, objName): self.wpc = WordPadController() if self.wpc is None else self.wpc #print(objName) if isinstance(self.__dict__[objName], QLineEdit): self.wpc.initInfo(self.__dict__[objName].text()) elif isinstance(self.__dict__[objName], QPlainTextEdit): self.wpc.initInfo(self.__dict__[objName].toPlainText()) else: self.msgDialog.showErrorDialog("出错", "该项暂不支持写字板输入") return if self.wpc.exec_() == QDialog.Accepted: if isinstance(self.__dict__[objName], QLineEdit): self.__dict__[objName].setText(self.wpc.getInfo()) elif isinstance(self.__dict__[objName], QPlainTextEdit): self.__dict__[objName].setPlainText(self.wpc.getInfo()) def cleanDB(self): if self.db.resetDB(): self.msgDialog.showInformationDialog("提示", "重置数据库成功!") else: self.msgDialog.showErrorDialog("操作失败", "重置数据库失败!") def resetDB(self): dbSettingCtrl = DBSettingController() #dbSettingCtrl.show() return dbSettingCtrl.exec_() == QDialog.Accepted def setGraphColor(self, tar, pos, option): col = QColorDialog.getColor() if col.isValid(): tar.setStyleSheet('QWidget {background-color:%s}' % col.name()) self.graphStyle[pos]["nodes"][option] = col.name() self.refreshUserColor() def setLineWidth(self, tar, pos): self.graphStyle[pos]["lineLen"] = tar.value() self.refreshUserColor() def showPreviewGraph(self): graph = drawGraph() graph.draw("preview", self.user, self.graphStyle) def getCompanyInfo(self): if self.db.checkConnection(): companyList = self.db.searchWithKeyword() self.completer = QCompleter(companyList) self.searchContent.setCompleter(self.completer) def search(self): searchContent = self.searchContent.text() try: user = self.db.searchById(searchContent) except Exception as e: self.msgDialog.showErrorDialog( "数据库错误", "数据库发生错误!\n异常信息为:" + self.db.dbException + "\n您做的任何变动将无法存入数据库!") else: if user.company != "": self.setInput(user) self.searchContent.setText("") self.currentSelectedFile = set() self.updateLevelFileList() def setInput(self, user): #clear c = self.departmentList.count() for i in range(c): self.departmentList.takeItem(0) c = self.previewPic.count() for i in range(c): self.previewPic.takeItem(0) c = self.projectList.count() for i in range(c): self.projectList.takeItem(0) # self.fileNameText.setText(user.fileName) self.companyText.setText(user.company) self.addressText.setText(user.address) self.coverFieldText.setText(user.coverField) self.corporateText.setText(user.corporateRepresentative) self.managerText.setText(user.manager) self.guandaiText.setText(user.guandai) self.compilerText.setText(user.compiler) self.approverText.setText(user.approver) self.auditText.setText(user.audit) self.announcerText.setText(user.announcer) self.zipText.setText(user.zip) self.phoneText.setText(user.phone) self.policyText.setText(user.policy) self.Logo.setPlainText(user.logoPath) self.showLogo() # dateReg = re.compile( r"^(?P<year>\d{4})[\u4e00-\u9fa5](?P<month>\d{2})[\u4e00-\u9fa5](?P<day>\d{2})[\u4e00-\u9fa5]$" ) date = dateReg.match(user.releaseDate) self.releaseDateText.setDate( QDate(int(date.group("year")), int(date.group("month")), int(date.group("day")))) date = dateReg.match(user.auditDate) self.auditDateText.setDate( QDate(int(date.group("year")), int(date.group("month")), int(date.group("day")))) # self.introductionText.setPlainText("\n".join(user.introduction)) #数据库中有总经理等项,不需要reset self.user.departments = [] for dep in user.departments: self.departmentList.addItem(dep["name"]) self.user.departments.append(dep) self.setDepStruct() colors = json.loads(user.color) for i in range(len(colors)): getattr(self, "level" + str(i + 1) + "Border").setStyleSheet('QWidget {background-color:%s}' % colors[i]["nodes"]["fillcolor"]) getattr(self, "level" + str(i + 1) + "Font").setStyleSheet('QWidget {background-color:%s}' % colors[i]["nodes"]["fontcolor"]) getattr(self, "level" + str(i + 1) + "Width").setValue( colors[i]["lineLen"]) self.graphStyle = colors #清空第二页右 self.depName.setText("") self.depLevel.setValue(1) self.depIntro.setPlainText("") for i in range(1, 43): getattr(self, 'duty_' + str(i)).setCheckState(0) #四层项目 self.user.projects = [] for proj in user.projects: self.projectList.addItem(proj.BasicInfo.PartyA.projectName) self.user.projects.append(proj) #四层组织 self.user.organization = user.organization self.showOrganization() def setUser(self): # self.user.fileName = self.fileNameText.text() self.user.company = self.companyText.text() self.user.address = self.addressText.text() self.user.coverField = self.coverFieldText.text() self.user.corporateRepresentative = self.corporateText.text() self.user.manager = self.managerText.text() self.user.guandai = self.guandaiText.text() self.user.compiler = self.compilerText.text() self.user.approver = self.approverText.text() self.user.audit = self.auditText.text() self.user.announcer = self.announcerText.text() self.user.zip = self.zipText.text() self.user.phone = self.phoneText.text() self.user.policy = self.policyText.text() # self.user.releaseDate = self.releaseDateText.date().toString( "yyyy年MM月dd日") self.user.auditDate = self.auditDateText.date().toString("yyyy年MM月dd日") # self.user.introduction = str( self.introductionText.toPlainText()).split('\n') def setDepartments(self, departmentName): if departmentName == "": pass elif self.depName.text() == "": self.msgDialog.showErrorDialog("录入信息错误", "部门名称不能为空") else: department = self.user.departments[self.departmentList.row( self.departmentList.currentItem())] self.departmentList.currentItem().setText(self.depName.text()) department['name'] = self.depName.text() department['level'] = self.depLevel.value() department['intro'] = str(self.depIntro.toPlainText()).split('\n') department['func'] = [] department['leader'] = self.leader.text() department['operator'] = self.Operator.text() for i in range(1, 43): if getattr(self, 'duty_' + str(i)).checkState(): department['func'].append(i) self.setDepStruct() def refreshGraph(self, keys, levelDict): #clear c = self.previewPic.count() for i in range(self.previewPic.count()): self.previewPic.takeItem(0) #add for key in keys: deps = levelDict[key].split(",") for dep in deps: self.previewPic.addItem("级别:" + str(key) + " | 部门: " + dep) def setDepStruct(self): if not self.user.departments or len(self.user.departments) == 0: self.user.depStruct = "" self.refreshGraph([], {}) else: levelDict = {} try: for dep in self.user.departments: if not dep.__contains__('level'): continue elif not levelDict.__contains__(dep['level']): levelDict[dep['level']] = dep['name'] else: levelDict[dep['level']] = levelDict[ dep['level']] + "," + dep['name'] except Exception as e: print("Error:", e) self.user.depStruct = "" else: keys = list(levelDict.keys()) keys.sort() gramma = [levelDict[key] for key in keys] self.user.depStruct = ";\n".join(gramma) self.user.depStruct = self.user.depStruct + ";" self.refreshGraph(keys, levelDict) def addDepartment(self, departmentName="部门名称"): self.departmentList.addItem(departmentName) self.user.departments.append({"name": departmentName}) c = self.departmentList.count() self.departmentList.setCurrentItem(self.departmentList.item(c - 1)) def showDepartmentDetail(self, departmentName): if departmentName == "": self.depName.setText("") self.depIntro.setPlainText("") self.depLevel.setValue(0) self.leader.setText("") self.Operator.setText("") for i in range(1, 43): getattr(self, 'duty_' + str(i)).setCheckState(0) else: department = self.user.departments[self.departmentList.row( self.departmentList.currentItem())] self.depName.setText(departmentName) self.depIntro.setPlainText('\n'.join(department['intro']) if 'intro' in department else "") self.depLevel.setValue(department['level'] if 'level' in department else 1) self.leader.setText(department['leader'] if 'leader' in department else "") self.Operator.setText(department['operator'] if 'operator' in department else "") #特别情况 if departmentName == "总经理" or departmentName == "管理者代表": self.leader.setEnabled(False) self.Operator.setEnabled(False) else: self.leader.setEnabled(True) self.Operator.setEnabled(True) for i in range(1, 43): #clear all getattr(self, 'duty_' + str(i)).setCheckState(0) for i in (department['func'] if 'func' in department else []): getattr(self, 'duty_' + str(i)).setCheckState(2) def removeDepartment(self, departmentName): if (departmentName == ""): return ####请勿修改顺序,takeItem在移除item前会触发itemChanged,若已删除user则导致越界错误 index = self.departmentList.row(self.departmentList.currentItem()) self.departmentList.takeItem(index) del self.user.departments[index] ######## self.setDepStruct() def generateDoc(self): genDocCtrl = WriteDocController(fileName=self.user.fileName, projects=[ proj.BasicInfo.PartyA.projectName for proj in self.user.projects ], selectedFile=self.currentSelectedFile) #genDocCtrl.show() if genDocCtrl.exec_() == QDialog.Accepted: validMsg = self.user.validChecker() files = genDocCtrl.getAllSelectedFile() self.currentSelectedFile = genDocCtrl.getAllSelectedFile() self.updateLevelFileList() if validMsg[0]: self.refreshDatabase() self.msgDialog.showInformationDialog( "生成信息", "文档已准备就绪!共有%d份文档,请点击“OK”开始生成。" % len(files)) progress = QProgressDialog(self) progress.setWindowTitle("请稍等") progress.setLabelText("正在生成...") progress.setCancelButtonText("取消") progress.setWindowModality(Qt.WindowModal) progress.setRange(0, 100) progress.setMinimumDuration(2000) progress.setValue(0) total = len(files) count = 0 #生成并保存部门结构图 graph = drawGraph() self.user = graph.draw("save", self.user, self.graphStyle) for file in files: # 线程优化 self.writeDocLock.acquire() count += 1 wrt_thread = WrtDocThread( user=self.user, srcDir=self.pathSelector.getFileInfo(file) ["spath"], #self.pathSelector.getFilePath(file), tarDir=self.pathSelector.getFileInfo(file) ["tpath"], #self.pathSelector.getFilePath(file,self.user.fileName)) fileType=self.pathSelector.getFileInfo(file)["type"], projectName=self.pathSelector.getFileInfo( file)["belongto"]) wrt_thread.start() wrt_thread.wait() progress.setValue(int((float(count) / total) * 100)) self.writeDocLock.release() progress.setValue(100) self.msgDialog.showInformationDialog("生成信息", "文档成功生成!") else: self.msgDialog.showErrorDialog("录入信息错误", validMsg[1]) def saveInfoButNotGen(self): self.refreshDatabase(True) def refreshDatabase(self, isSave=False): try: #print("正在更新数据库...") self.db.delete("info", self.user.company) self.db.insertData(self.user) if (isSave): self.msgDialog.showInformationDialog("提示", "文档信息已保存到数据库") except Exception as e: #print("更新数据库失败") print(e) self.msgDialog.showErrorDialog( "连接数据库出错", "数据库无法连接,更新数据库失败,请检查相应配置!\n异常信息为:" + self.db.dbException + "\n您做的任何变动将无法存入数据库!") else: #print("更新数据库成功") self.getCompanyInfo() def newUser(self): #提示保存到数据库 pass # new = userInfo() new.color = json.dumps(self.graphStyle) self.setInput(new) def refreshUserColor(self): self.user.color = json.dumps(self.graphStyle) def refreshDepartmentList(self): #clear list c = self.departmentList.count() for i in range(c): self.departmentList.takeItem(0) c = self.previewPic.count() for i in range(c): self.previewPic.takeItem(0) #add for d in self.user.departments: self.departmentList.addItem(d["name"]) self.setDepStruct() # level 2 / 3 file list def setupLevelFileList(self): self.currentSelectedFile_temp = self.currentSelectedFile self.currentSelectedFile = set() self.setupLevelFileList_level( treeNode=self.pathSelector.customFileTree[ self.pathSelector.sampleDir], nodeName="Level2", viewNode=None, selectedFile=self.currentSelectedFile_temp, isRoot=True, filePath="/".join([self.pathSelector.sampleDir, "Level2"]), fileList_item=self.level2_fileList, rootName='二层文件模板目录') self.setupLevelFileList_level( treeNode=self.pathSelector.customFileTree[ self.pathSelector.sampleDir], nodeName="Level3", viewNode=None, selectedFile=self.currentSelectedFile_temp, isRoot=True, filePath="/".join([self.pathSelector.sampleDir, "Level3"]), fileList_item=self.level3_fileList, rootName='三层文件模板目录') def setupLevelFileList_level(self, treeNode, nodeName, viewNode, selectedFile, isRoot=True, filePath=None, fileList_item=None, rootName=None): if isRoot: isRoot = False # 删除源节点 fileList_item.takeTopLevelItem(0) # 新建源节点 root = QTreeWidgetItem(fileList_item) root.setText(0, rootName) # 设置根节点的名称 fileList_item.addTopLevelItem(root) fileList_item.reset() self.setupLevelFileList_level(treeNode[nodeName], None, root, selectedFile, isRoot, filePath) fileList_item.sortItems(0, Qt.AscendingOrder) fileList_item.expandItem(root) return if isinstance(treeNode, list): return else: for k, v in treeNode.items(): p = "/".join([filePath, k]) child = QTreeWidgetItem(viewNode) child.setText(0, k) child.setText(1, p) if isinstance(treeNode[k], list): if p in selectedFile: child.setCheckState(0, Qt.Checked) else: child.setCheckState(0, Qt.Unchecked) else: self.setupLevelFileList_level(treeNode[k], k, child, selectedFile, isRoot, p) def updateLevelFileList(self): self.pathSelector.autoRefresh(company=self.user.fileName, projects=[ proj.BasicInfo.PartyA.projectName for proj in self.user.projects ]) self.setupLevelFileList() def level2FileChangeHandler(self, item, column): if item.checkState(column) == Qt.Checked: if item.text(column + 1): self.currentSelectedFile.add(item.text(column + 1)) elif item.checkState(column) == Qt.Unchecked: if item.text(column + 1): self.currentSelectedFile.discard(item.text(column + 1)) def level3FileChangeHandler(self, item, column): if item.checkState(column) == Qt.Checked: if item.text(column + 1): self.currentSelectedFile.add(item.text(column + 1)) elif item.checkState(column) == Qt.Unchecked: if item.text(column + 1): self.currentSelectedFile.discard(item.text(column + 1)) #四层页面 def connectProjectList(self): #可能没选中,用attr确认 #选中时为 projectList.currentItem().text() ,否则为 str() self.projectList.currentItemChanged.connect( lambda: self.showProjectDetail( getattr(self.projectList.currentItem(), 'text', str)())) self.AddProject.clicked.connect(lambda: self.addProject()) self.DeleteProject.clicked.connect(lambda: self.removeProject( getattr(self.projectList.currentItem(), 'text', str)())) self.cancelProject.clicked.connect(lambda: self.showProjectDetail( getattr(self.projectList.currentItem(), 'text', str)())) self.saveProject.clicked.connect(lambda: self.setProject( getattr(self.projectList.currentItem(), 'text', str)())) #四层组织 self.saveOrgan.clicked.connect(lambda: self.setOrganization()) self.discardOrgan.clicked.connect(lambda: self.showOrganization()) def addProject(self, projectName="项目名称"): self.projectList.addItem(projectName) new = Project(projectName) self.user.projects.append(new) self.projectList.setCurrentItem( self.projectList.item(self.projectList.count() - 1)) def removeProject(self, projectName=""): if (projectName == ""): return else: ### critical ### index = self.projectList.row(self.projectList.currentItem()) self.projectList.takeItem(index) del self.user.projects[index] ### end Critical ### def setProject(self, projectName): if projectName == "": pass elif self.AprojectNameText.text() == "": self.msgDialog.showErrorDialog("录入信息错误", "项目名称不能为空") else: project = self.user.projects[self.projectList.row( self.projectList.currentItem())] self.projectList.currentItem().setText( self.AprojectNameText.text()) self.setA(project) self.setB(project) self.setDetail(project) self.setTeam(project) self.setReport(project) self.setProjectEvent(project) self.setConfig(project) self.setContinuity(project) #self.setAudit(project) #self.setRecord(project) def showProjectDetail(self, projectName): if projectName == "": self.showA() self.showB() self.showDetail() self.showTeam() self.showReport() self.showProjectEvent() self.showConfig() self.showContinuity() #self.showAudit() #self.showRecord() else: project = self.user.projects[self.projectList.row( self.projectList.currentItem())] self.showA(project) self.showB(project) self.showDetail(project) self.showTeam(project) self.showReport(project) self.showProjectEvent(project) self.showConfig(project) self.showContinuity(project) #self.showAudit(project) #self.showRecord(project) def setOrganization(self): self.setAudit() self.setRecord() # self.showOrganization() def showOrganization(self): self.showAudit() self.showRecord() def setA(self, project): project.BasicInfo.PartyA.projectName = self.AprojectNameText.text() project.BasicInfo.PartyA.company = self.AcompanyText.text() project.BasicInfo.PartyA.name = self.AnameText.text() project.BasicInfo.PartyA.phone = self.AphoneText.text() project.BasicInfo.PartyA.address = self.AaddressText.text() def setB(self, project): project.BasicInfo.PartyB.contactName = self.BcontactNameText.text() project.BasicInfo.PartyB.serviceName = self.BserviceNameText.text() project.BasicInfo.PartyB.serviceMail = self.BserviceMailText.text() project.BasicInfo.PartyB.servicePhone = self.BservicePhoneText.text() project.BasicInfo.PartyB.complainName = self.BcomplainNameText.text() project.BasicInfo.PartyB.complainMail = self.BcomplainMailText.text() project.BasicInfo.PartyB.complainPhone = self.BcomplainPhoneText.text() def setDetail(self, project): project.BasicInfo.Detail.amount = self.amountText.text() project.BasicInfo.Detail.period = self.periodText.text() project.BasicInfo.Detail.config = str( self.configText.toPlainText()).split('\n') project.BasicInfo.Detail.name = self.detailNameText.text() project.BasicInfo.Detail.level = self.detailLevelText.text() project.BasicInfo.Detail.details = str( self.detailsText.toPlainText()).split('\n') project.BasicInfo.Detail.demand = str( self.demandText.toPlainText()).split('\n') project.BasicInfo.Detail.ddl = self.ddlText.text() def setTeam(self, project): project.BasicInfo.Team.startTime = self.startTimeText.text() project.BasicInfo.Team.require = self.requireText.text() project.BasicInfo.Team.PM = self.PMText.text() project.BasicInfo.Team.TM = self.TMText.text() def setReport(self, project): project.ServiceProcess.Report.time = self.reportTimeText.text() project.ServiceProcess.Report.keypoint = self.keypointText.text() project.ServiceProcess.Report.revisit = self.revisitText.text() def setProjectEvent(self, project): project.ServiceProcess.Event.eventManager = self.eventManagerText.text( ) project.ServiceProcess.Event.issueManager = self.issueManagerText.text( ) project.ServiceProcess.Event.S1 = self.S1acceptedText.value() project.ServiceProcess.Event.S2 = self.S2acceptedText.value() project.ServiceProcess.Event.S3 = self.S3acceptedText.value() project.ServiceProcess.Event.S4 = self.S4acceptedText.value() project.ServiceProcess.Event.closed = self.closedText.value() project.ServiceProcess.Event.transformed = self.transformedText.value() project.ServiceProcess.Event.summarized = self.summarizedText.value() def setConfig(self, project): project.ServiceProcess.Config.modifyManager = self.modifyManagerText.text( ) project.ServiceProcess.Config.configManager = self.configManagerText.text( ) project.ServiceProcess.Config.releaseManager = self.releaseManagerText.text( ) project.ServiceProcess.Config.relatedManager = self.relatedManagerText.text( ) project.ServiceProcess.Config.configVersion = self.configVersionText.text( ) project.ServiceProcess.Config.configReleaseDate = self.configReleaseDateText.text( ) project.ServiceProcess.Config.changes = int(self.changesText.text()) project.ServiceProcess.Config.releases = int(self.releasesText.text()) project.ServiceProcess.Config.releaseDate = self.ConfigReleaseDateText.text( ) project.ServiceProcess.Config.preReleaseDate = self.ConfigPreReleaseDateText.text( ) project.ServiceProcess.Config.applicationDate = self.applicationDateText.text( ) project.ServiceProcess.Config.SN = self.SNText.text() project.ServiceProcess.Config.target = self.targetText.text() project.ServiceProcess.Config.item = self.itemText.text() project.ServiceProcess.Config.releaseVersion = self.releaseVersionText.text( ) project.ServiceProcess.Config.subject = self.subjectText.text() def setContinuity(self, project): project.ServiceProcess.Continuity.process = str( self.processText.toPlainText()).split('\n') project.ServiceProcess.Continuity.result = str( self.resultText.toPlainText()).split('\n') project.ServiceProcess.Continuity.date = self.ContinuityDateText.text() project.ServiceProcess.Continuity.technicist = self.technicistText.text( ) project.ServiceProcess.Continuity.approver = self.ContinuityApproverText.text( ) project.ServiceProcess.Continuity.compileDate = self.ContinuityCompileDateText.text( ) project.ServiceProcess.Continuity.auditDate = self.ContinuityAuditDateText.text( ) def setAudit(self): self.user.organization.Audit.planDate = self.planDateText.text() self.user.organization.Audit.auditDate = self.AuditAuditDateText.text() self.user.organization.Audit.auditLeader = self.auditLeaderText.text() self.user.organization.Audit.audit1 = self.audit1Text.text() self.user.organization.Audit.audit2 = self.audit2Text.text() self.user.organization.Audit.audit3 = self.audit3Text.text() self.user.organization.Audit.reviewDate = self.reviewDateText.text() self.user.organization.Audit.scheduleDate = self.scheduleDateText.text( ) self.user.organization.Audit.excuteDate = self.excuteDateText.text() self.user.organization.Audit.reportDate = self.reportDateText.text() self.user.organization.Audit.compiler = self.AuditCompilerText.text() self.user.organization.Audit.audit = self.AuditAuditText.text() self.user.organization.Audit.compileDate = self.AuditCompileDateText.text( ) self.user.organization.Audit.approveDate = self.AuditApproveDateText.text( ) def setRecord(self): self.user.organization.Record.target = self.RecordTargetText.text() self.user.organization.Record.time = self.RecordTimeText.text() self.user.organization.Record.staff = self.RecordStaffText.text() self.user.organization.Record.arrange = str( self.RecordArrangeText.toPlainText()).split('\n') self.user.organization.Record.content = str( self.RecordContentText.toPlainText()).split('\n') self.user.organization.Record.fileName = self.RecordFileNameText.text() self.user.organization.Record.auditContent = str( self.auditContentText.toPlainText()).split('\n') self.user.organization.Record.auditProcess = str( self.auditProcessText.toPlainText()).split('\n') self.user.organization.Record.audit = self.RecordAuditText.text() self.user.organization.Record.auditDate = self.RecordAuditDateText.text( ) self.user.organization.Record.approver = self.RecordApproverText.text() self.user.organization.Record.approveDate = self.RecordApproveDateText.text( ) self.user.organization.Record.provider = self.providerText.text() def showA(self, project=""): if project == "": project = Project("") self.AprojectNameText.setText(project.BasicInfo.PartyA.projectName) self.AcompanyText.setText(project.BasicInfo.PartyA.company) self.AnameText.setText(project.BasicInfo.PartyA.name) self.AphoneText.setText(project.BasicInfo.PartyA.phone) self.AaddressText.setText(project.BasicInfo.PartyA.address) def showB(self, project=""): if project == "": project = Project("") self.BcontactNameText.setText(project.BasicInfo.PartyB.contactName) self.BserviceNameText.setText(project.BasicInfo.PartyB.serviceName) self.BserviceMailText.setText(project.BasicInfo.PartyB.serviceMail) self.BservicePhoneText.setText(project.BasicInfo.PartyB.servicePhone) self.BcomplainNameText.setText(project.BasicInfo.PartyB.complainName) self.BcomplainMailText.setText(project.BasicInfo.PartyB.complainMail) self.BcomplainPhoneText.setText(project.BasicInfo.PartyB.complainPhone) def showDetail(self, project=""): if project == "": project = Project("") self.amountText.setText(project.BasicInfo.Detail.amount) self.periodText.setText(project.BasicInfo.Detail.period) self.configText.setPlainText("\n".join( project.BasicInfo.Detail.config)) self.detailNameText.setText(project.BasicInfo.Detail.name) self.detailLevelText.setText(project.BasicInfo.Detail.level) self.detailsText.setPlainText("\n".join( project.BasicInfo.Detail.details)) self.demandText.setPlainText("\n".join( project.BasicInfo.Detail.demand)) self.ddlText.setText(project.BasicInfo.Detail.ddl) def showTeam(self, project=""): if project == "": project = Project("") self.startTimeText.setText(project.BasicInfo.Team.startTime) self.requireText.setText(project.BasicInfo.Team.require) self.PMText.setText(project.BasicInfo.Team.PM) self.TMText.setText(project.BasicInfo.Team.TM) def showReport(self, project=""): if project == "": project = Project("") self.reportTimeText.setText(project.ServiceProcess.Report.time) self.keypointText.setText(project.ServiceProcess.Report.keypoint) self.revisitText.setText(project.ServiceProcess.Report.revisit) def showProjectEvent(self, project=""): if project == "": project = Project("") self.eventManagerText.setText( project.ServiceProcess.Event.eventManager) self.issueManagerText.setText( project.ServiceProcess.Event.issueManager) self.S1acceptedText.setValue(project.ServiceProcess.Event.S1) self.S2acceptedText.setValue(project.ServiceProcess.Event.S2) self.S3acceptedText.setValue(project.ServiceProcess.Event.S3) self.S4acceptedText.setValue(project.ServiceProcess.Event.S4) self.closedText.setValue(project.ServiceProcess.Event.closed) self.transformedText.setValue(project.ServiceProcess.Event.transformed) self.summarizedText.setValue(project.ServiceProcess.Event.summarized) def showConfig(self, project=""): if project == "": project = Project("") self.modifyManagerText.setText( project.ServiceProcess.Config.modifyManager) self.configManagerText.setText( project.ServiceProcess.Config.configManager) self.releaseManagerText.setText( project.ServiceProcess.Config.releaseManager) self.relatedManagerText.setText( project.ServiceProcess.Config.relatedManager) self.configVersionText.setText( project.ServiceProcess.Config.configVersion) self.configReleaseDateText.setText( project.ServiceProcess.Config.configReleaseDate) self.changesText.setText(str(project.ServiceProcess.Config.changes)) self.releasesText.setText(str(project.ServiceProcess.Config.releases)) self.ConfigReleaseDateText.setText( project.ServiceProcess.Config.releaseDate) self.ConfigPreReleaseDateText.setText( project.ServiceProcess.Config.preReleaseDate) self.applicationDateText.setText( project.ServiceProcess.Config.applicationDate) self.SNText.setText(project.ServiceProcess.Config.SN) self.targetText.setText(project.ServiceProcess.Config.target) self.itemText.setText(project.ServiceProcess.Config.item) self.releaseVersionText.setText( project.ServiceProcess.Config.releaseVersion) self.subjectText.setText(project.ServiceProcess.Config.subject) def showContinuity(self, project=""): if project == "": project = Project("") self.processText.setPlainText("\n".join( project.ServiceProcess.Continuity.process)) self.resultText.setPlainText("\n".join( project.ServiceProcess.Continuity.result)) self.ContinuityDateText.setText(project.ServiceProcess.Continuity.date) self.technicistText.setText( project.ServiceProcess.Continuity.technicist) self.ContinuityApproverText.setText( project.ServiceProcess.Continuity.approver) self.ContinuityCompileDateText.setText( project.ServiceProcess.Continuity.compileDate) self.ContinuityAuditDateText.setText( project.ServiceProcess.Continuity.auditDate) def showAudit(self): self.planDateText.setText(self.user.organization.Audit.planDate) self.AuditAuditDateText.setText(self.user.organization.Audit.auditDate) self.auditLeaderText.setText(self.user.organization.Audit.auditLeader) self.audit1Text.setText(self.user.organization.Audit.audit1) self.audit2Text.setText(self.user.organization.Audit.audit2) self.audit3Text.setText(self.user.organization.Audit.audit3) self.reviewDateText.setText(self.user.organization.Audit.reviewDate) self.scheduleDateText.setText( self.user.organization.Audit.scheduleDate) self.excuteDateText.setText(self.user.organization.Audit.excuteDate) self.reportDateText.setText(self.user.organization.Audit.reportDate) self.AuditCompilerText.setText(self.user.organization.Audit.compiler) self.AuditAuditText.setText(self.user.organization.Audit.audit) self.AuditCompileDateText.setText( self.user.organization.Audit.compileDate) self.AuditApproveDateText.setText( self.user.organization.Audit.approveDate) def showRecord(self): self.RecordTargetText.setText(self.user.organization.Record.target) self.RecordTimeText.setText(self.user.organization.Record.time) self.RecordStaffText.setText(self.user.organization.Record.staff) self.RecordArrangeText.setPlainText("\n".join( self.user.organization.Record.arrange)) self.RecordContentText.setPlainText("\n".join( self.user.organization.Record.content)) self.RecordFileNameText.setText(self.user.organization.Record.fileName) self.auditContentText.setPlainText("\n".join( self.user.organization.Record.auditContent)) self.auditProcessText.setPlainText("\n".join( self.user.organization.Record.auditProcess)) self.RecordAuditText.setText(self.user.organization.Record.audit) self.RecordAuditDateText.setText( self.user.organization.Record.auditDate) self.RecordApproverText.setText(self.user.organization.Record.approver) self.RecordApproveDateText.setText( self.user.organization.Record.approveDate) self.providerText.setText(self.user.organization.Record.provider)
class GUI: """ 用户接口类,将视图与逻辑对接 @author weingxing @since 2020/04/02 """ def __init__(self): self.db = DB() self.view = View() self.view.set_ui() self.sno = tk.StringVar() self.name = tk.StringVar() self.sex = tk.StringVar() self.college = tk.StringVar() self.clazz = tk.StringVar() self.connect() # 添加信息 def add(self, event): sno = self.view._entry_sno.get() name = self.view._entry_name.get() sex = self.view._entry_sex.get() college = self.view._entry_college.get() clazz = self.view._entry_clazz.get() # 判断是否输入数据 if sno != '' and name != '' and sex != '' and college != '' and clazz != '': if self.db.insert(sno=sno, name=name, sex=sex, college=college, clazz=clazz): values = (sno, name, sex, college, clazz) self.view.data_list.insert('', 'end', values=values) # 新建线程进行弹窗,否则按钮按点击后无法弹起来 _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='添加成功'), ()) else: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='添加失败'), ()) # 清空输入框 self.view._entry_sno.delete(0, len(sno)) self.view._entry_name.delete(0, len(name)) self.view._entry_sex.delete(0, len(sex)) self.view._entry_college.delete(0, len(college)) self.view._entry_clazz.delete(0, len(clazz)) else: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='请输入信息'), ()) def update(self, event): sno = self.view.entry_sno.get() name = self.view.entry_name.get() sex = self.view.entry_sex.get() college = self.view.entry_college.get() clazz = self.view.entry_clazz.get() if sno != '' and name != '' and sex != '' and college != '' and clazz != '': if self.db.update(sno=sno, name=name, sex=sex, college=college, clazz=clazz): # 从数据库成功更新后更新界面,要传入event,这里使用 '' 代替 self.refresh('') _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='更新成功'), ()) else: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='更新失败'), ()) else: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='请补全信息'), ()) def delete(self, event): sno = self.view.entry_sno.get() if sno != '': if self.db.delete(sno): # 从数据库成功删除后更新界面 self.refresh('') # 清空信息 self.sno.set('') self.view.entry_sno.configure(textvariable=self.sno) self.view.entry_name.delete(0, len(self.name.get())) self.view.entry_sex.delete(0, len(self.sex.get())) self.view.entry_college.delete(0, len(self.college.get())) self.view.entry_clazz.delete(0, len(self.clazz.get())) _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='删除成功'), ()) else: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='删除失败'), ()) else: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='未选中数据'), ()) def search(self, event): key = self.view.entry_search.get() try: assert not key == '' # 清空现有数据 x = self.view.data_list.get_children() for item in x: self.view.data_list.delete(item) result = self.db.search(key) assert not result is None i = 0 for d in result: self.view.data_list.insert('', i, value=d) i += 1 except AssertionError: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='搜索失败'), ()) def refresh(self, event): try: # 清空现有数据 x = self.view.data_list.get_children() for item in x: self.view.data_list.delete(item) result = self.db.select() assert not result is None i = 0 for d in result: self.view.data_list.insert('', i, value=d) i += 1 except AssertionError: _thread.start_new_thread( lambda: tk.messagebox.showinfo(message='刷新失败'), ()) def detail(self, event): if len(self.view.data_list.selection()) != 0: item = self.view.data_list.selection()[0] values = self.view.data_list.item(item, "values") self.sno.set(values[0]) self.name.set(values[1]) self.sex.set(values[2]) self.college.set(values[3]) self.clazz.set(values[4]) self.view.entry_sno.configure(textvariable=self.sno) self.view.entry_name.configure(textvariable=self.name) self.view.entry_sex.configure(textvariable=self.sex) self.view.entry_college.configure(textvariable=self.college) self.view.entry_clazz.configure(textvariable=self.clazz) def connect(self): self.view.btn_add.bind('<Button-1>', self.add) self.view.btn_update.bind('<Button-1>', self.update) self.view.btn_delete.bind('<Button-1>', self.delete) self.view.btn_search.bind('<Button-1>', self.search) self.view.btn_refresh.bind('<Button-1>', self.refresh) self.view.data_list.bind('<ButtonRelease-1>', self.detail) def start(self): data = self.db.select() i = 0 for d in data: self.view.data_list.insert('', i, value=d) i += 1 self.view.window.mainloop()
class MainApp(QMainWindow, MainUI): def __init__(self, parent=None): super(MainApp, self).__init__(parent) self.setupUi(self) self.setFixedWidth(965) self.setFixedHeight(585) self.db = DB() self.handle_buttons() self.handle_table_tab() self.threadpool = QThreadPool() self.abnormal, self.acl, self.men = 0, 0, 0 self.edit_dialog = None self.extract_dialog = None return def start_edit_dialog(self, id, name, age, blood, note): self.edit_dialog = uic.loadUi(r"GUI\edit_dialog.ui") self.edit_dialog.txt_id.setPlainText(id) self.edit_dialog.txt_name.setPlainText(name) self.edit_dialog.spin_age.setValue(age) self.edit_dialog.combo_blood.setCurrentIndex(blood) self.edit_dialog.txt_note.setPlainText(note) self.edit_dialog.bu_update.clicked.connect( lambda x: self.edit_dialog_update(id)) self.edit_dialog.bu_delete.clicked.connect( lambda x: self.edit_dialog_delete(id)) self.edit_dialog.bu_extract.clicked.connect( lambda x: self.dialog_extract(id)) self.edit_dialog.show() def edit_dialog_update(self, id): self.db.update_name(id, self.edit_dialog.txt_name.toPlainText()) self.db.update_age(id, self.edit_dialog.spin_age.value()) self.db.update_blood(id, self.edit_dialog.combo_blood.currentIndex()) self.db.update_note(id, self.edit_dialog.txt_note.toPlainText()) self.edit_dialog_close() self.lbl_state.setText( 'state with id:{} successfully updated!'.format(id)) def edit_dialog_delete(self, id): self.db.delete(id) self.edit_dialog_close() self.lbl_state.setText( 'state with id:{} successfully deleted!'.format(id)) def edit_dialog_close(self): self.update_table(self.db.get_all_data(50)) self.edit_dialog.reject() def dialog_extract(self, id): self.start_dialog_extract(id) self.edit_dialog_close() def start_dialog_extract(self, id): self.extract_dialog = uic.loadUi(r'GUI\extract.ui') self.extract_dialog.bu_save.clicked.connect( lambda x: self.get_save_location(id)) self.extract_dialog.check_video.stateChanged.connect( self.video_check_changed) self.extract_dialog.show() def video_check_changed(self, state): if state == 2: self.extract_dialog.combo_video.setEnabled(True) else: self.extract_dialog.combo_video.setEnabled(False) def get_save_location(self, id): loc = QFileDialog.getSaveFileName(self, 'Open File', directory=os.path.join( os.environ["HOMEPATH"], "Desktop"), filter='All Files (*)') loc = str(loc[0]) if loc == '': loc = os.path.join(os.environ["HOMEPATH"], r"Desktop\{}".format(id)) if not os.path.exists(loc): os.mkdir(loc) if self.extract_dialog.check_personal.isChecked(): file = open(loc + r'\data.txt', 'w') file.write(''' ID :\t{} Name :\t{} Age :\t{} Blood :\t{} Note :\t{} Acl result :\t{} Abnormal result :\t{} Men result :\t{} '''.format(id, self.db.get_name(id), self.db.get_age(id), self.get_text_blood(self.db.get_blood(id)), self.db.get_note(id), self.get_text_result(self.db.get_acl(id)), self.get_text_result(self.db.get_abnormal(id)), self.get_text_result(self.db.get_men(id)))) if self.extract_dialog.check_images.isChecked(): self.extract_images(id, loc) if self.extract_dialog.check_video.isChecked(): frames = self.extract_dialog.combo_video.currentIndex() if frames == 0: frames = 30 elif frames == 1: frames = 15 elif frames == 2: frames = 30 elif frames == 3: frames = 60 self.extract_video(id, loc, frames) self.lbl_state.setText( 'state with id:{}, Data successfully extracted!'.format(id)) self.extract_dialog.reject() def handle_table_tab(self): self.tableWidget.setColumnWidth(0, 10) self.tableWidget.setColumnWidth(1, 200) self.tableWidget.setColumnWidth(2, 20) self.tableWidget.setColumnWidth(3, 20) self.tableWidget.setColumnWidth(4, 70) self.tableWidget.setColumnWidth(5, 70) self.tableWidget.setColumnWidth(6, 70) self.tableWidget.setColumnWidth(7, 300) self.tableWidget.setColumnWidth(8, 130) self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.txt_search.textChanged.connect(self.filter_) def update_table(self, data): if self.tabWidget.currentIndex() != 1: return self.tableWidget.setRowCount(len(data)) for i in range(0, len(data)): self.tableWidget.setItem(i, 0, QTableWidgetItem(str(data[i][0]))) #id self.tableWidget.setItem(i, 1, QTableWidgetItem(str(data[i][1]))) #name self.tableWidget.setItem(i, 2, QTableWidgetItem(str(data[i][2]))) #age self.tableWidget.setItem( i, 3, QTableWidgetItem(self.get_text_blood(data[i][3]))) #blood self.tableWidget.setItem( i, 4, QTableWidgetItem(self.get_text_result(data[i][7]))) #abnormal self.tableWidget.setItem( i, 5, QTableWidgetItem(self.get_text_result(data[i][8]))) #acl self.tableWidget.setItem( i, 6, QTableWidgetItem(self.get_text_result(data[i][9]))) #men self.tableWidget.setItem(i, 7, QTableWidgetItem(str(data[i][10]))) #note self.tableWidget.setItem(i, 8, QTableWidgetItem(str( data[i][11]))) #created at for j in range(0, 9): self.tableWidget.item(i, j).setTextAlignment(Qt.AlignHCenter) self.lbl_state.setText('table successfully updated!') return def handle_buttons(self): self.btn_axial.clicked.connect(lambda x: self.get_images(0)) self.btn_coronal.clicked.connect(lambda x: self.get_images(1)) self.btn_sagittal.clicked.connect(lambda x: self.get_images(2)) self.btn_examine.clicked.connect(self.examine) self.tabWidget.currentChanged.connect( lambda x: self.update_table(self.db.get_all_data(50))) self.tabWidget.setTabEnabled(2, False) self.tableWidget.cellDoubleClicked.connect(self.cell_clicked) self.menu_excel_file.triggered.connect(self.extract_xlsx) self.tabWidget.setCurrentIndex(0) def cell_clicked(self, row, column): id = self.tableWidget.item(row, 0).text() self.start_edit_dialog(id, self.db.get_name(id), self.db.get_age(id), self.db.get_blood(id), self.db.get_note(id)) def filter_(self): engine = self.txt_search.toPlainText() if self.radio_id.isChecked() == True: if engine == '': data = self.db.filter_by_name('') elif engine.isdigit(): data = self.db.filter_by_id(engine) else: data = self.db.filter_by_id('-1') elif self.radio_name.isChecked() == True: data = self.db.filter_by_name(engine) else: data = self.db.filter_by_Date(engine) self.update_table(data) return def examine(self): now = DateTime() try: if self.axial_images_location == '[]' or self.coronal_images_location == '[]' or self.sagittal_images_location == '[]': QMessageBox.warning(self, "Error!", "can\'t load images!") return except AttributeError: QMessageBox.warning(self, "Error!", "can\'t load images!") return if not self.check_text_constrains(self.get_name()): QMessageBox.warning(self, "Error!", "name field can't contain (' , \)") return if not self.check_text_constrains(self.get_note()): QMessageBox.warning(self, "Error!", "note field can't contain (' , \)") return self.btn_examine.setEnabled(False) self.lbl_state.setText('in progress...') self.th = threads.ExamineThread(self.get_thread_data, self.axial_images_location, self.coronal_images_location, self.sagittal_images_location, self.get_name(), self.get_age(), self.get_blood(), self.get_note(), now.Date() + ' ' + now.AMPM()) self.th.signals.finished.connect(self.on_thread_finished) self.threadpool.start(self.th) def get_thread_data(self, abnormal, acl, men): self.abnormal = abnormal self.acl = acl self.men = men def on_thread_finished(self): report = ''' Abnormal\t: {} Acl\t\t: {} Meniscus\t: {} '''.format(self.get_text_result(self.abnormal), self.get_text_result(self.acl), self.get_text_result(self.men)) self.txt_report.setPlainText(report) self.lbl_state.setText('Done, state saved successfully!') self.btn_examine.setEnabled(True) self.reset_fieldes() def get_images(self, key): loc = QFileDialog.getOpenFileNames( self, 'Open File', directory=os.path.join(os.environ["HOMEPATH"], "Desktop"), filter='Image (*.jpg *.JPG *.png *.PNG *.jpeg *.JPEG)') loc = str(loc[0])[:] num_images = len(loc.split(',')) if key == 0: self.axial_images_location = loc if loc == '[]': self.lbl_axial_counter.setText('no image selected') else: self.lbl_axial_counter.setText( '{} images selected'.format(num_images)) elif key == 1: self.coronal_images_location = loc if loc == '[]': self.lbl_coronal_counter.setText('no image selected') else: self.lbl_coronal_counter.setText( '{} images selected'.format(num_images)) else: self.sagittal_images_location = loc if loc == '[]': self.lbl_sagittal_counter.setText('no image selected') else: self.lbl_sagittal_counter.setText( '{} images selected'.format(num_images)) return def get_name(self): self.name = self.txt_name.toPlainText() return self.name def get_blood(self): self.blood = self.combo_blood.currentIndex() return self.blood def get_age(self): self.age = self.spin_age.value() return self.age def get_note(self): self.note = self.txt_note.toPlainText() return self.note def get_text_result(self, result): if round(float(result)) == 0: return 'negative' else: return 'positive' def get_text_blood(self, blood): if blood == 0: return 'None' return 'A+ A- B+ B- AB+ AB- O+ O-'.split()[blood - 1] def extract_video(self, id, loc, frames): Exports.export_video(id, 'axial', frames, 'axial', loc) Exports.export_video(id, 'coronal', frames, 'coronal', loc) Exports.export_video(id, 'sagittal', frames, 'sagittal', loc) def extract_xlsx(self): try: loc = QFileDialog.getSaveFileName( self, 'Choose File', directory=os.path.dirname(__file__)) except FileNotFoundError: QMessageBox.warning(self, "Error!", "can\'t find path") loc = str(loc[0])[:] if loc == '': return os.mkdir(loc) workbook = xls.Workbook(os.path.join(loc, 'data.xlsx')) worksheet = workbook.add_worksheet() rows = self.db.get_all_data() worksheet.write(0, 0, 'ID') worksheet.write(0, 1, 'Name') worksheet.write(0, 2, 'Age') worksheet.write(0, 3, 'Blood') worksheet.write(0, 4, 'Abnormal result') worksheet.write(0, 5, 'Acl result') worksheet.write(0, 6, 'Men result') worksheet.write(0, 7, 'Note') worksheet.write(0, 8, 'Created at') for i, row in enumerate(rows): worksheet.write(i, 0, row[0]) #id worksheet.write(i, 1, row[1]) #name worksheet.write(i, 2, row[2]) #age worksheet.write(i, 3, self.get_text_blood(row[3])) #blood worksheet.write(i, 4, self.get_text_result(row[7])) #abnormal worksheet.write(i, 5, self.get_text_result(row[8])) #acl worksheet.write(i, 6, self.get_text_result(row[9])) #men worksheet.write(i, 7, row[10]) #note worksheet.write(i, 8, row[11]) #time workbook.close() self.lbl_state.setText('all data successfully extracted!') return def extract_images(self, id, location): if location == '': location = os.path.join(os.environ["HOMEPATH"], r"Desktop\{}".format(id)) axial = np.load(r'database\axial_{}.npy'.format(id)) coronal = np.load(r'database\coronal_{}.npy'.format(id)) sagittal = np.load(r'database\sagittal_{}.npy'.format(id)) os.mkdir(os.path.join(location, 'axial images')) os.mkdir(os.path.join(location, 'coronal images')) os.mkdir(os.path.join(location, 'sagittal images')) for j, i in enumerate(axial): cv.imwrite( os.path.join(location, 'axial images') + r'\{}.jpg'.format(j), i) for j, i in enumerate(coronal): cv.imwrite( os.path.join(location, 'coronal images') + r'\{}.jpg'.format(j), i) for j, i in enumerate(sagittal): cv.imwrite( os.path.join(location, 'sagittal images') + r'\{}.jpg'.format(j), i) def check_text_constrains(self, text): text = re.search(r"'|\\|\"", text) if text: return False return True def reset_fieldes(self): self.txt_name.setPlainText('') self.combo_blood.setCurrentIndex(0) self.spin_age.setValue(0) self.txt_note.setPlainText('') self.axial_images_location = '[]' self.sagittal_images_location = '[]' self.coronal_images_location = '[]'
def run(): # create tables db = DB() # db.create_tables() data = None # loop while True: # display menu Menu.display(Menu.menu_options) # get user input selection = Menu.get_user_input(Menu.menu_options) # select if selection == 1: # returns a tuple with ( name, country, number of catches ) data = Dialogs.show_create() db.insert(data) # find if selection == 2: Menu.display(Menu.find_options) # get user input selection = Menu.get_user_input(Menu.find_options) if selection == 1: name = Dialogs.get_string_input('Enter name\n') results = db.find_by_name(name) # results obj Menu.print_results(results) elif selection == 2: country = Dialogs.get_string_input('Enter country\n') results = db.find_by_country(country) Menu.print_results(results) elif selection == 3: catches = Dialogs.get_int_input('Enter number of catches\n') results = db.find_by_catches(str(catches)) Menu.print_results(results) # update a record elif selection == 3: data = db.get_all() Menu.print_results(data) new_data = Dialogs.show_update() #returns dictionary db.update(new_data) # delete a record elif selection == 4: data = db.get_all() Menu.print_results(data) id_to_delete = Dialogs.show_delete() db.delete(id_to_delete) data = db.get_all() Menu.print_results(data) # see all records elif selection == 5: results = db.get_all() Menu.print_results(results) # exit program elif selection == 6: db.close_connection() exit()