Download tools/mosesdecoder/mingw/MosesGUI/mainWindow.py from Quagmire1/wiki-cased: direct link, hf CLI and curl.
- Browser
- Download file 8.83 kB
-
https://huggingface.co/Quagmire1/wiki-cased/resolve/main/tools/mosesdecoder/mingw/MosesGUI/mainWindow.py
- Command line
-
hf download hf://Quagmire1/wiki-cased/tools/mosesdecoder/mingw/MosesGUI/mainWindow.py
-
curl -L -o mainWindow.py https://huggingface.co/Quagmire1/wiki-cased/resolve/main/tools/mosesdecoder/mingw/MosesGUI/mainWindow.py
8.83 kB
| # -*- coding: utf-8 -*- | |
| """ | |
| Module implementing MainWindow. | |
| """ | |
| from PyQt4.QtCore import ( | |
| pyqtSignature, | |
| QObject, | |
| Qt, | |
| SIGNAL, | |
| ) | |
| from PyQt4.QtGui import ( | |
| QMainWindow, | |
| QMessageBox, | |
| QProgressDialog, | |
| ) | |
| import sys | |
| import threading | |
| from Ui_mainWindow import Ui_MainWindow | |
| from addMTModel import AddMTModelDialog | |
| from chooseMTModel import ChooseMTModelDialog | |
| from engine import Engine | |
| from credits import DlgCredits | |
| from util import doAlert | |
| class MainWindow(QMainWindow, Ui_MainWindow): | |
| """ | |
| Class documentation goes here. | |
| """ | |
| def setupUi(self, mainWindow): | |
| super(MainWindow, self).setupUi(mainWindow) | |
| self.tableView.setModel(self.datamodel) | |
| self.tableView.hideColumn(0) | |
| # Change status and keep the column. | |
| QObject.connect( | |
| self.datamodel, SIGNAL("recordUpdated(bool)"), | |
| self.on_datamodel_recordUpdated) | |
| QObject.connect( | |
| self.datamodel, SIGNAL("messageBox(QString)"), | |
| self.on_datamodel_messageBox) | |
| # The response to change model. | |
| for obj in (self.editModelName, self.editSrcLang, self.editTrgLang): | |
| obj.installEventFilter(self) | |
| def __init__(self, parent=None, dm=None, moses=None, workdir=None): | |
| """ | |
| Constructor | |
| """ | |
| QMainWindow.__init__(self, parent) | |
| self.moses = moses | |
| self.datamodel = dm | |
| self.engine = None | |
| self.progress = None | |
| self.workdir = workdir | |
| def on_delModelBtn_clicked(self): | |
| """ | |
| Slot documentation goes here. | |
| """ | |
| current = self.tableView.currentIndex() | |
| if not current or current.row() < 0: | |
| return | |
| model_in_use = ( | |
| self.engine and | |
| self.datamodel.getRowID(current.row()) == self.engine.model['ID'] | |
| ) | |
| if model_in_use: | |
| text = ( | |
| "The model is still in use, do you want to " | |
| "stop and delete it?\n" | |
| "It might take a while..." | |
| ) | |
| reply = QMessageBox.question( | |
| None, 'Message', text, QMessageBox.Yes, QMessageBox.No) | |
| if reply == QMessageBox.No: | |
| return | |
| t = self.stopEngine(self.engine) | |
| t.join() | |
| self.engine = None | |
| self.clearPanel() | |
| self.datamodel.delModel(current.row()) | |
| def on_newModelBtn_clicked(self): | |
| """ | |
| Slot documentation goes here. | |
| """ | |
| dialog = AddMTModelDialog(self, self.workdir) | |
| if dialog.exec_(): | |
| installParam = { | |
| 'modelName': dialog.modelName, | |
| 'source': dialog.source, | |
| 'sourceMode': dialog.sourceMode, | |
| 'dest': dialog.dest, | |
| } | |
| self.datamodel.installModel(installParam) | |
| self.tableView.selectRow(self.tableView.model().rowCount() - 1) | |
| # self.datamodel.newEntry() | |
| def on_datamodel_recordUpdated(self, bRecord): | |
| # Deal with the selection changed problem. | |
| try: | |
| if bRecord: | |
| current = self.tableView.currentIndex() | |
| if current and current.row() != -1: | |
| self.curSelection = current.row() | |
| else: | |
| self.curSelection = None | |
| else: | |
| if self.curSelection is not None: | |
| self.tableView.selectRow(self.curSelection) | |
| except Exception, e: | |
| print >> sys.stderr, str(e) | |
| def on_datamodel_messageBox(self, str): | |
| doAlert(str) | |
| def closeEvent(self, event): | |
| # Clear up. | |
| if self.datamodel.destroy(): | |
| event.accept() | |
| else: | |
| event.reject() | |
| def eventFilter(self, obj, event): | |
| for obj in (self.editModelName, self.editSrcLang, self.editTrgLang): | |
| if self.gridLayout.indexOf(obj) != -1: | |
| if event.type() == event.MouseButtonPress: | |
| dialog = ChooseMTModelDialog(self, self.datamodel) | |
| if dialog.exec_(): | |
| # Get the model. | |
| model = { | |
| 'ID': dialog.ID, | |
| 'name': dialog.modelName, | |
| 'srclang': dialog.srcLang, | |
| 'trglang': dialog.trgLang, | |
| 'path': dialog.path, | |
| 'mosesini': dialog.mosesini, | |
| } | |
| self.startEngine(model) | |
| return True # We handle it here. | |
| return super(MainWindow, self).eventFilter(obj, event) | |
| def stopEngine(self, engine): | |
| # Stop the engine with another thread. | |
| def stopEngineThread(): | |
| engine.stop() | |
| t = threading.Thread(target=stopEngineThread) | |
| t.start() | |
| return t | |
| def startEngine(self, model): | |
| self.editModelName.setText(model['name']) | |
| self.editSrcLang.setText(model['srclang']) | |
| self.editTrgLang.setText(model['trglang']) | |
| self.editSrc.setText("") | |
| self.editTrg.setText("") | |
| try: | |
| if self.engine: | |
| self.stopEngine(self.engine) | |
| self.engine = None | |
| # Create engine. | |
| self.engine = Engine(model, self.moses) | |
| # Create progress bar dialog. | |
| if self.progress: | |
| self.progress.close() | |
| self.progress = None | |
| self.progress = QProgressDialog( | |
| "Model: %s" % model['name'], "Cancel", 0, | |
| self.engine.countSteps(), self) | |
| self.progress.setAutoReset(True) | |
| self.progress.setAutoClose(True) | |
| self.progress.setWindowModality(Qt.WindowModal) | |
| self.progress.setWindowTitle('Loading Model...') | |
| QObject.connect( | |
| self.progress, SIGNAL("canceled()"), self.progressCancelled) | |
| self.progress.show() | |
| # Connect engine signal. | |
| QObject.connect( | |
| self.engine, SIGNAL("stepFinished(int)"), | |
| self.engineStepFinished) | |
| QObject.connect( | |
| self.engine, SIGNAL("loaded(bool, QString)"), | |
| self.engineLoaded) | |
| def startEngineThread(): | |
| self.engine.start() | |
| t = threading.Thread(target=startEngineThread) | |
| t.start() | |
| except Exception, e: | |
| if self.engine: | |
| self.stopEngine(self.engine) | |
| self.engine = None | |
| self.clearPanel() | |
| doAlert("Error start MT engine: " + str(e)) | |
| def clearPanel(self): | |
| if self.engine: | |
| self.stopEngine(self.engine) | |
| self.engine = None | |
| self.editModelName.setText("") | |
| self.editSrcLang.setText("") | |
| self.editTrgLang.setText("") | |
| self.editSrc.setText("") | |
| self.editTrg.setText("") | |
| def progressCancelled(self): | |
| self.clearPanel() | |
| if self.engine: | |
| self.stopEngine(self.engine) | |
| self.engine = None | |
| if self.progress: | |
| self.progress = None | |
| def engineStepFinished(self, nStep): | |
| if self.progress: | |
| self.progress.setValue(nStep) | |
| def engineLoaded(self, success, message): | |
| if not success: | |
| self.clearPanel() | |
| if message: | |
| doAlert(message) | |
| else: | |
| if self.progress: | |
| self.progress.setValue(self.progress.maximum()) | |
| self.progress = None | |
| def on_btnTranslate_clicked(self): | |
| """ | |
| Slot documentation goes here. | |
| """ | |
| if self.engine is None: | |
| doAlert("Please load MT model first.") | |
| return | |
| self.btnTranslate.setEnabled(False) | |
| self.editTrg.setText("") | |
| try: | |
| texts = str(self.editSrc.toPlainText().toUtf8()).split('\n') | |
| trans = [] | |
| for text in texts: | |
| if text.strip() == "": | |
| trans.append(text) | |
| else: | |
| trans.append( | |
| self.engine.translate( | |
| text.replace('\r', ' ').strip()).decode('utf8')) | |
| self.editTrg.setText('\n'.join(trans)) | |
| except Exception, e: | |
| print >> sys.stderr, str(e) | |
| doAlert("Translation failed!") | |
| self.btnTranslate.setEnabled(True) | |
| self.btnTranslate.setFocus() | |
| def on_labelInfo_linkActivated(self, link): | |
| """ | |
| Slot documentation goes here. | |
| """ | |
| dialog = DlgCredits(self) | |
| dialog.exec_() | |