コード例 #1
0
ファイル: update.py プロジェクト: zhqagp/cdn_cert
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()
コード例 #2
0
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)
コード例 #3
0
ファイル: gui.py プロジェクト: weingxing/python-assigment
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()
コード例 #4
0
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 = '[]'
コード例 #5
0
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()