示例#1
0
class MyMainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):    
        super(MyMainWindow, self).__init__(parent)
        self.setupUi(self)
        self.btnLoadPlugeDict.hide()

        self.viewList = list()
        self.PluDictViewList = list()
        self.historyInputList = list()
        #词典列表
        self.PlugeDictionary=list()
        '''
        读取配置文件
        '''
        self.ReadConfig()

        self.checkBoxPlugeDict.stateChanged.connect(self.LoadPlugeDict)
        self.btnExcel2Json.clicked.connect(self.Excel2Json)
        self.btnLoadJson.clicked.connect(self.getAttrFilePath)
        self.btnLoadCorpus.clicked.connect(self.getReadCorpusFilePath)
        self.btnPreviousPage.clicked.connect(self.PreviousPage)
        self.btnNextPage.clicked.connect(self.NextPage)
        self.btnJumpPage.clicked.connect(self.JumpPage)
        self.btnSaveCorpus.clicked.connect(self.getSaveCorpusFilePath)
        self.btnCommit.clicked.connect(self.Commit)
        self.btnLoadPlugeDict.clicked.connect(self.getPlugeDictionaryFilePath)
        self.btnOpenInputHistory.clicked.connect(self.ShowInputHistoryDock)
        self.btnClearInputHistory.clicked.connect(self.ClearInputHistory)
        self.btnResearch.clicked.connect(self.Research)
        self.lineEditResearch.textChanged.connect(self.Research)
        self.listWidgetResearch.itemClicked.connect(self.CommitResearch)
        self.btnEntityResearch.clicked.connect(self.EntityResearch)
        self.SetHistoryInputDock()

    def CommitResearch(self,qModelIndex):
        self.UpdateAttr(1)
        text=self.sourceText
        text=text.split('}')[0]
        tlist=self.listWidgetResearch.selectedItems()
        tlist=[t.text() for t in list(tlist)]
        text=text+','+','.join(tlist)+'}'
        self.lineEditResult.setText(text)

    def Research(self):
        self.listWidgetResearch.clear()
        self.sourceText=self.lineEditResult.text()
        compileString=self.lineEditResearch.text()
        #print(compileString)
        cp=re.compile('%s'%compileString)
        for items in self.PlugeDictionary:
            for item in items:
               #print(item)
               if len(re.findall(cp,item))!=0:
                   self.listWidgetResearch.addItem(item)

    def ClearInputHistory(self):
        self.historyInputListWidget.clear()
        self.historyInputList=[]

    def ShowInputHistoryDock(self):
        self.dockWidgetHistoryInput.show()

    def SetHistoryInputDock(self):
        self.historyInputListWidget=QListWidget()
        self.dockWidgetHistoryInput.setWidget(self.historyInputListWidget)
        self.historyInputListWidget.addItems(self.historyInputList)
        self.historyInputListWidget.itemClicked.connect(self.HistoryInput2lineEditResult)

    def HistoryInput2lineEditResult(self,qModelIndex):
        #print(qModelIndex)
        tlist=self.historyInputListWidget.selectedItems()
        text=[t.text() for t in list(tlist)]
        self.lineEditResult.setText(','.join(text))

    def LoadPlugeDict(self):
        if self.checkBoxPlugeDict.isChecked():
            self.btnLoadPlugeDict.show()
            for listWidget in self.PluDictViewList:
                listWidget.show()
        else:
            self.btnLoadPlugeDict.hide()
            for listWidget in self.PluDictViewList:
                listWidget.hide()

        self.UpdateAttr('')

    def Excel2Json(self):
        ex = excel2json(self)
        ex.show()

    def getAttrFilePath(self):
        tmpPath, _ = QFileDialog.getOpenFileName(self,
                                                  r'打开JSON',
                                                  r'./',
                                                  r'JSON File(*.json)')
        if tmpPath !='':
            self.attrFilePath=tmpPath
            self.LoadJson()

    def getReadCorpusFilePath(self):
        tmpPath, _ = QFileDialog.getOpenFileName(self,
                                                  r'打开语料',
                                                  r'./',
                                                  r'Excel File(*.xls *.xlsx)')
        if tmpPath !='':
            self.readCorpusFilePath=tmpPath
            self.LoadCorpus()

    def getSaveCorpusFilePath(self):
        filepath,_ = QFileDialog.getSaveFileName(self,
                                                r'保存语料',
                                                r'./',
                                                r'Excel File (*.xls)')
        tmpPath=filepath
        if tmpPath !='':
            self.saveCorpusFilePath=tmpPath
            self.SaveCorpus()

    def getPlugeDictionaryFilePath(self):
        tmpPath, _ = QFileDialog.getOpenFileName(self,
                                                  r'打开JSON',
                                                  r'./',
                                                  r'JSON File(*.json)')
        if tmpPath !='':
            self.plugeDictionaryFilePath=tmpPath
            self.PlugeDict()

    def LoadJson(self):
        self.jr=JsonReader(self.attrFilePath)
        self.ShowEntity()

    def EntityResearch(self):
        try:
            self.comboBoxEntitys.currentIndexChanged.disconnect(self.ShowAttribute)
        except:
            print('the slot dont have sign')

        entityList = self.jr.getEntityList()
        string = self.lineEditEntityResearch.text()
        cp = re.compile(string)
        researchList = list()
        for entity in entityList:
            if re.findall(cp,entity) != []:
                researchList.append(entity)
        self.comboBoxEntitys.clear()
        self.comboBoxEntitys.addItems(researchList)
        self.comboBoxEntitys.currentIndexChanged.connect(self.ShowAttribute)

    def ShowEntity(self):
        try:
            self.comboBoxEntitys.currentIndexChanged.disconnect(self.ShowAttribute)
        except:
            print('the slot dont have sign')
        self.comboBoxEntitys.clear()
        self.comboBoxEntitys.addItems(self.jr.getEntityList())
        self.comboBoxEntitys.currentIndexChanged.connect(self.ShowAttribute)
    
    def ShowAttribute(self,i):
        entity=self.comboBoxEntitys.currentText()

        attrList,attrListLength = self.jr.getCurrentEntityAttributeList(entity)

        #print(attrListLength)
        if len(self.viewList) < attrListLength:
            listIndex = -1
            for view in self.viewList:
                slm = QStringListModel()
                listIndex+=1
                view.clear()
                view.addItems(self.jr.getAttributeItems(entity,listIndex))

            widgetColumnIndex=listIndex
            widgetRowIndex=0

            for i in range(attrListLength-len(self.viewList)):
                #print(slm)
                listIndex+=1
                widgetColumnIndex+=1
                
                if widgetColumnIndex > 4:
                    widgetRowIndex+=1
                    widgetColumnIndex=0
                print(r'widgetRowIndex:{},widgetColumnIndex:{}'.format(widgetRowIndex,widgetColumnIndex))
                tmpListView = QListWidget()
                tmpListView.addItems(self.jr.getAttributeItems(entity,listIndex))
                tmpListView.itemClicked.connect(self.UpdateAttr)
                # 按住CTRL可多选
                tmpListView.setSelectionMode(QAbstractItemView.ExtendedSelection)
                self.viewList.append(tmpListView)
                self.gridLayoutAttrListView.addWidget(tmpListView,widgetRowIndex,widgetColumnIndex)
        else:
            for index in range(attrListLength):
                self.viewList[index].clear()
                self.viewList[index].addItems(self.jr.getAttributeItems(entity,index))
                self.viewList[index].show()

            for index in range(attrListLength,len(self.viewList)):
                self.viewList[index].hide() 

    def UpdateAttr(self,qModelIndex):
        result=[]
        for view in self.viewList:
            tlist = view.selectedItems()
            text = [t.text() for t in list(tlist)]
            result+=text

        if self.checkBoxPlugeDict.isChecked():
            for pdview in self.PluDictViewList:
                tlist = pdview.selectedItems()
                text = [t.text() for t in list(tlist)]
                result+=text

        self.lineEditResult.setText('{'+','.join(result)+'}')

    def LoadCorpus(self):
        self.cr=CorpusReader(self.readCorpusFilePath)
        id,corpu=self.cr.getCorpu(1)
        self.UpdataCorpu(id,corpu)

    #上一页
    def PreviousPage(self):
        id=self.cr.getId()
        id,corpu=self.cr.getCorpu(id-1)
        self.UpdataCorpu(id,corpu)
        self.lineEditResult.setText(self.cr.getCorpuResult(id))

    #下一页
    def NextPage(self):
        id=self.cr.getId()
        id,corpu=self.cr.getCorpu(id+1)
        self.UpdataCorpu(id,corpu)
        self.lineEditResult.setText(self.cr.getCorpuResult(id))

    #页面跳转
    def JumpPage(self):
        id=int(self.lineEditPage.text())
        _,corpu=self.cr.getCorpu(id)
        self.UpdataCorpu(id,corpu)
        self.lineEditResult.setText(self.cr.getCorpuResult(id))

    def UpdataCorpu(self,id,corpu):
        self.lblNo.setText(str(id))
        self.lblSourceCorpu.setText(corpu)

    def SaveCorpus(self):
        self.cr.setSavePath(self.saveCorpusFilePath)

    #提交结果
    def Commit(self):
        id=self.cr.getId()
        corpu=self.lineEditResult.text()
        self.cr.Commit(id,corpu)
        self.cr.Save()
        '''将输入加载到历史输入框中'''
        if corpu not in self.historyInputList:
            self.historyInputList.append(corpu)
            self.historyInputListWidget.addItem(corpu)

    def PlugeDict(self):
        self.plugeDictjr=JsonReader(self.plugeDictionaryFilePath)
        self.plugeDictAttrList=self.plugeDictjr.getEntityList()
        widgetRowIndex=0
        widgetColumnIndex=-1
        for attrTitle in self.plugeDictAttrList:
            #print(self.plugeDictjr.getPlugeDictAttrItems(attrTitle))
            widgetColumnIndex+=1
                
            if widgetColumnIndex > 4:
                widgetRowIndex+=1
                widgetColumnIndex=0
            print(r'widgetRowIndex:{},widgetColumnIndex:{}'.format(widgetRowIndex,widgetColumnIndex))
            tmpListView = QListWidget()
            item=self.plugeDictjr.getPlugeDictAttrItems(attrTitle)
            self.PlugeDictionary.append(item)
            tmpListView.addItems(item)
            tmpListView.itemClicked.connect(self.UpdateAttr)
                # 按住CTRL可多选
            tmpListView.setSelectionMode(QAbstractItemView.ExtendedSelection)
            self.PluDictViewList.append(tmpListView)
            tmpListView.hide()
            self.gridLayoutPlugeDictListView.addWidget(tmpListView,widgetRowIndex,widgetColumnIndex)

    def closeEvent(self, event):
        """
        重写closeEvent方法,实现dialog窗体关闭时执行一些代码
        :param event: close()触发的事件
        :return: None
        """
        configItems=list()
        
        try:
            configItems.append('historyInputList&&'+"||".join(self.historyInputList))
            configItems.append('readCorpusFilePath&&'+self.readCorpusFilePath)
            configItems.append('attrFilePath&&'+self.attrFilePath)
            configItems.append('plugeDictionaryFilePath&&'+self.plugeDictionaryFilePath)
            configItems.append('saveCorpusFilePath&&'+self.saveCorpusFilePath)           
        except:
            print('存在设置没有设定')
        self.configFile.WriteConfig(configItems)

    def ReadConfig(self):
        self.configFile = ConfigFile()
        configItems=self.configFile.ReadConfig()

        for item in configItems:
            part=item.strip('\n').split('&&')
            if len(part)!=1:
                if part[0]=='attrFilePath':
                    self.attrFilePath=part[1]
                    self.LoadJson()
                elif part[0]=='plugeDictionaryFilePath':
                    self.plugeDictionaryFilePath=part[1]
                    self.PlugeDict()
                elif part[0]=='saveCorpusFilePath':
                    self.saveCorpusFilePath=part[1]
                    self.SaveCorpus()
                elif part[0]=='readCorpusFilePath':
                    self.readCorpusFilePath=part[1]
                    self.LoadCorpus()
                elif part[0]=='historyInputList':
                    self.historyInputList=part[1].split('||')