class MasterForm(QMainWindow): def __init__(self, parent=None): super(MasterForm, self).__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) # Encrypt/Decrypt button self.ui.pushEncrypt.clicked.connect(self.tamponencrypt) self.ui.pushDecrypt.clicked.connect(self.tampondecrypt) self.ui.pushSign.clicked.connect(self.tamponsign) self.ui.pushVerify.clicked.connect(self.tamponverify) # Menu connexions self.ui.actionCopier.triggered.connect(self.ui.plainTextEdit.copy) self.ui.actionColler.triggered.connect(self.ui.plainTextEdit.paste) self.ui.actionCut.triggered.connect(self.ui.plainTextEdit.cut) self.ui.actionCacher.triggered.connect(self.toolbarvisibility) self.ui.actionShow_text_icons.triggered.connect( self.texticonsvisibility) self.ui.actionKeymanager.triggered.connect(keymanager) self.ui.actionInfos_QPyCrypto.triggered.connect(openabout) self.ui.actionInfos_Qt.triggered.connect(self.aboutqt) self.ui.actionChiffrerfichier.triggered.connect(self.encryptfile) self.ui.actionDechiffrerfichier.triggered.connect(self.decryptfile) self.ui.actionChiffrer_un_fichier_Enigma.triggered.connect( self.encryptfileenigma) self.ui.actionD_chiffrer_un_fichier_Enigma.triggered.connect( self.decryptfileenigma) self.ui.actionSigner_un_fichier.triggered.connect(self.signfile) self.ui.actionVerifier_signature.triggered.connect(self.verifysignfile) self.ui.actionVider_Tampon.triggered.connect(self.vidertampon) self.ui.actionOuvrir.triggered.connect(self.ouvrirtexte) self.ui.actionSauver.triggered.connect(self.sauvertexte) self.ui.actionQuitter.triggered.connect(sys.exit) # Menu HASH File: self.ui.actionSHA512.triggered.connect(self.hashfilesha512) self.ui.actionSHA384.triggered.connect(self.hashfilesha384) self.ui.actionSHA256.triggered.connect(self.hashfilesha256) self.ui.actionSHA224.triggered.connect(self.hashfilesha224) self.ui.actionSHA_1.triggered.connect(self.hashfilesha) self.ui.actionMD5_2.triggered.connect(self.hashfilemd5) self.ui.actionMD2.triggered.connect(self.hashfilemd2) self.ui.actionMD4.triggered.connect(self.hashfilemd4) self.ui.actionRIPEMD_160.triggered.connect(self.hashfileripemd_160) self.ui.actionRIPEMD_128.triggered.connect(self.hashfileripemd_128) self.ui.actionWhirlpool.triggered.connect(self.hashfileWhirlpool) self.ui.actionTiger.triggered.connect(self.hashfileTiger) self.ui.actionAdler32.triggered.connect(self.hashfileAdler32) self.ui.actionCRC24.triggered.connect(self.hashfileCrc24) self.ui.actionCRC32.triggered.connect(self.hashfileCrc32) self.ui.actionSHA_3_winner_Keccak_1600.triggered.connect( self.hashfileKeccak_1600) self.ui.actionSHA_3_candidate_Skein_512.triggered.connect( self.hashfileSkein_512) self.ui.actionGOST_34_11.triggered.connect(self.hashfileGOST_34_11) def encryptfileenigma(self): filename, _ = QFileDialog.getOpenFileName( self, "Select the file to encrypt", "", "All Files (*)") if filename: dialog = Fenselectkey(self) if dialog.exec_() == QDialog.Accepted: m_key = dialog.ui.EditPass.text() algorithm = dialog.ui.comboAlgo.currentText() if algorithm == "Serpent-256": algo = "srp" if algorithm == "AES-256": algo = "aes" if algorithm == "Twofish-256": algo = "twf" result = encryptfile(filename, m_key, algo) if result["success"] == "successfully encrypted": QMessageBox.information( self, "Successfully encrypted", "File: " + filename + " is encrypted with " + algorithm, QMessageBox.Ok) else: QMessageBox.information( self, "Encryption Error", "Encryption error: " + result["success"], QMessageBox.Ok) self.ui.statusbar.showMessage( "File " + filename + " is encrypted.", 50000) return def decryptfileenigma(self): filename, _ = QFileDialog.getOpenFileName( self, "Select the file to decrypt", "", "Cryptoshop Files (*.cryptoshop);;All Files (*)") if filename: m_key, ok = QInputDialog.getText(self, "Enter your passphrase", "Key:", QLineEdit.Normal) if ok and m_key != '': try: result = decryptfile(filename, m_key) if result["success"] == "successfully decrypted": QMessageBox.information( self, "Successfully Decrypted", "File: " + filename + " encrypted with " + result["algorithm"] + " was successfully decrypted", QMessageBox.Ok) else: QMessageBox.warning( self, "Decryption Error", "Decryption Error " + result["success"], QMessageBox.Ok) except Exception as e: QMessageBox.warning(self, appname + version + "What that bug ??", (str(e)), QMessageBox.Ok) def signfile(self): filename, _ = QFileDialog.getOpenFileName(self, "Select a file to sign", "", "All files (*)") if filename: gpg = gnupg.GPG(use_agent=False) gpg.encoding = 'utf-8' dialog = Fenselectsignkey(self) if dialog.exec_() == QDialog.Accepted: keyid = dialog.ui.comboBox.currentText() key = dialog.ui.editKey.text() with open(filename, 'rb') as data: signed_data = gpg.sign_file(file=data, keyid=keyid, output=filename + ".sig", detach=True) print(signed_data) data.close() def verifysignfile(self): filename, _ = QFileDialog.getOpenFileName( self, "Select the sig file", "", "sig Files (*.sig);;asc Files (*.asc);;All Files (*)") if filename: with open(filename, 'rb') as stream: gpg = gnupg.GPG(use_agent=False) gpg.encoding = 'utf-8' data = os.path.splitext(filename)[0].split("_")[-1] verified = gpg.verify_file(stream, data) stream.close() if verified.valid is True: QMessageBox.information( self, appname + version + "Good Signature", "Good signature from: " + verified.username + "\n\nFingerprint: " + verified.fingerprint + "\nKey Id: " + verified.key_id + "\nThe signature was created at " + verified.creation_date + "\n\nTrust :" + verified.trust_text, QMessageBox.Ok) return if verified.valid is False and verified.username is None: QMessageBox.warning(self, appname + version + "No signature found", "No signature found: " + verified.stderr, QMessageBox.Ok) return else: QMessageBox.warning( self, appname + version + "Bad Signature", "Bad signature from: " + verified.username + "\nKey Id: " + verified.key_id + "\n\nTHE FILE IS CORRUPTED." + "\n\nDetails :\n" + verified.stderr, QMessageBox.Ok) def tamponverify(self): texttoverify = self.ui.plainTextEdit.toPlainText() gpg = gnupg.GPG(use_agent=False) gpg.encoding = 'utf-8' verified_data = gpg.verify(texttoverify) if verified_data.valid is False and verified_data.status is None: QMessageBox.warning(self, "No valid signature", "No valid signature.", QMessageBox.Ok) return if verified_data.valid is False: QMessageBox.warning( self, appname + version + "Bad Signature", "BAD SIGNATURE " + "\nDATA ARE CORRUPTED:\n\n" + "GnuPG Message: \n" + verified_data.stderr, QMessageBox.Ok) return if verified_data.valid is True: QMessageBox.information( self, appname + version + "Good Signature", "Good signature from: " + verified_data.username + "\nID " + verified_data.key_id + "\n\nFingerprint: \n" + verified_data.fingerprint + "\n\nGnuPG Message:\n" + verified_data.stderr, QMessageBox.Ok) else: QMessageBox.warning(self, appname + version + "Error", " Error ", QMessageBox.Ok) def updatePixmap(self, boll): if boll == "False": QMessageBox.warning(self, appname + version + "Error", " Wrong passphrase " + self.originalfile, QMessageBox.Ok) return else: self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Cryptoshop-->The file " + self.originalfile + " is decrypted") self.ui.plainTextEdit.appendPlainText( str("----->>>") + self.afterfile) def tamponsign(self): texttosign = self.ui.plainTextEdit.toPlainText() gpg = gnupg.GPG(use_agent=False) dialog = Fenselectsignkey(self) if dialog.exec_() == QDialog.Accepted: key = dialog.ui.comboBox.currentText() signed_data = gpg.sign(texttosign, keyid=key) if str(signed_data) == "": QMessageBox.critical( self, appname + version + "Can't Sign...", '''The passphrase is invalid for unlock this key.''', QMessageBox.Ok) return self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(str(signed_data)) def toolbarvisibility(self): if self.ui.actionCacher.isChecked(): self.ui.toolBar.hide() else: self.ui.toolBar.show() def texticonsvisibility(self): if self.ui.actionShow_text_icons.isChecked(): self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) else: self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly) def hidetexticons(self): self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly) def encryptfile(self): filename, _ = QFileDialog.getOpenFileName(self, "Select file to encrypt", "", "All (*)") if filename: dialog = Fenselectkeygpg(self) if dialog.exec_() == QDialog.Accepted: m_key = dialog.ui.editKey.text().strip() if dialog.ui.checkSymetric.isChecked(): if dialog.ui.editKey.text() == "": QMessageBox.warning(self, appname + version + "Error...", '''You must type a passphrase.''', QMessageBox.Ok) return encryordecry = True lname = "not used for encrypt" sym = True self.originalfile = filename self.myLongTask = Crypto_gpg.Worker( filename, m_key, encryordecry, lname, sym) self.myLongTask.renderedImage.connect(self.updatePixmap) self.myLongTask.isstarted.connect(self.isstarted) self.myLongTask.start() QMessageBox.warning( self, appname + version + "The file is encrypted", filename + ".gpg", QMessageBox.Ok) else: sym = False item = dialog.ui.comboBox.currentText() print(item) gpg = gnupg.GPG(use_agent=False) keylist = gpg.list_keys() uid_strings = [] uid_string2key = {} for key in keylist: for uid_string in key['uids']: uid_strings.append(uid_string) uid_string2key[uid_string] = key uid = item m_key = uid_string2key[uid] encryordecry = True lname = "not used for encrypt" sym = False self.myLongTask = Crypto_gpg.Worker( filename, m_key, encryordecry, lname, sym) self.myLongTask.renderedImage.connect(self.updatePixmap) self.myLongTask.isstarted.connect(self.isstarted) self.myLongTask.start() self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText( "Cryptoshop-->The file is encrypted.") self.ui.plainTextEdit.appendPlainText( str(filename + ".gpg")) def aboutqt(self): QMessageBox.aboutQt(self, appname + version + "Qt is the best !") def tamponencrypt(self): dialog = Fenselectkeygpg(self) if dialog.exec_() == QDialog.Accepted: self.m_key = dialog.ui.editKey.text().strip() if dialog.ui.checkSymetric.isChecked(): if dialog.ui.editKey.text() == "": QMessageBox.warning(self, appname + version + "Error", '''You must type a passphrase.''', QMessageBox.Ok) return gpg = gnupg.GPG(use_agent=False) plaintext = self.ui.plainTextEdit.toPlainText() crypted = gpg.encrypt(plaintext, False, passphrase=self.m_key, symmetric='AES256', armor=True) self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(str(crypted)) else: item = dialog.ui.comboBox.currentText() print(item) gpg = gnupg.GPG() keylist = gpg.list_keys() uid_strings = [] uid_string2key = {} for key in keylist: for uid_string in key['uids']: uid_strings.append(uid_string) uid_string2key[uid_string] = key uid = item key = uid_string2key[uid] unencrypted_string = self.ui.plainTextEdit.toPlainText() encrypted_data = gpg.encrypt(unencrypted_string, key['fingerprint'], always_trust=True) encrypted_string = str(encrypted_data) self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(encrypted_string) def sauvertexte(self): filename, _ = QFileDialog.getSaveFileName(self) if filename: file = QFile(filename) if not file.open(QFile.WriteOnly | QFile.Text): QMessageBox.critical( self, appname + version + "Save", "Writing Error %s:\n%s." % (filename, file.errorString())) return outstr = QTextStream(file) outstr << self.ui.plainTextEdit.toPlainText() QMessageBox.information( self, appname + version + "Save file", "The file is saved. \n%s" % (file.fileName())) def ouvrirtexte(self): filename, _ = QFileDialog.getOpenFileName(self) if filename: file = QFile(filename) if not file.open(QFile.ReadOnly | QFile.Text): QMessageBox.critical( self, appname + version + "Open File", "Reading Error %s:\n%s." % (filename, file.errorString())) return instr = QTextStream(file) self.ui.plainTextEdit.setPlainText(instr.readAll()) def vidertampon(self): self.ui.plainTextEdit.clear() def tampondecrypt(self): encrypted_string = str(self.ui.plainTextEdit.toPlainText()) gpg = gnupg.GPG(use_agent=False) decrypted_data = gpg.decrypt(encrypted_string) if decrypted_data.ok is True: self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(str(decrypted_data)) else: QMessageBox.warning(self, appname + version + "Invalid passphrase", ''' Invalid passphrase.''', QMessageBox.Ok) return def hashfileripemd_160(self): filename, _ = QFileDialog.getOpenFileName( self, "RIPEMD-160: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'RIPEMD-160') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-160 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileripemd_128(self): filename, _ = QFileDialog.getOpenFileName( self, "RIPEMD-128: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'RIPEMD-128') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-128 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilemd2(self): filename, _ = QFileDialog.getOpenFileName( self, "MD2: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'MD2') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash MD2 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilemd4(self): filename, _ = QFileDialog.getOpenFileName( self, "MD4: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'MD4') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash MD4 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilemd5(self): filename, _ = QFileDialog.getOpenFileName( self, "MD5: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'MD5') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash MD5 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha512(self): filename, _ = QFileDialog.getOpenFileName( self, "SHA-512: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-512') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-512 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha384(self): filename, _ = QFileDialog.getOpenFileName( self, "SHA-384: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-384') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-384 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha256(self): filename, _ = QFileDialog.getOpenFileName( self, "SHA-256: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-256') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-256 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha224(self): filename, _ = QFileDialog.getOpenFileName( self, "SHA-224: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-224') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-224 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha(self): filename, _ = QFileDialog.getOpenFileName( self, "SHA-1: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'SHA-1') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-1 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileWhirlpool(self): filename, _ = QFileDialog.getOpenFileName( self, "Whirlpool: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Whirlpool') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Whirlpool -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileTiger(self): filename, _ = QFileDialog.getOpenFileName( self, "Tiger: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Tiger') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Tiger -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileAdler32(self): filename, _ = QFileDialog.getOpenFileName( self, "Adler32: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Adler32') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Adler32 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileCrc24(self): filename, _ = QFileDialog.getOpenFileName( self, "Crc24: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'CRC24') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash CRC24 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileCrc32(self): filename, _ = QFileDialog.getOpenFileName( self, "Crc32: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'CRC32') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash CRC32 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileKeccak_1600(self): filename, _ = QFileDialog.getOpenFileName( self, "SHA-3 Keccak-1600: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Keccak-1600') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText( "Hash SHA-3 Keccak-1600 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileSkein_512(self): filename, _ = QFileDialog.getOpenFileName( self, "Skein_512: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Skein-512') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Skein-512 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileGOST_34_11(self): filename, _ = QFileDialog.getOpenFileName( self, "GOST 34.11: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'GOST-34.11') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText( "----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash GOST 34.11 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def decryptfile(self): filename, _ = QFileDialog.getOpenFileName( self, "Select encrypted file", "", "GPG files (*.gpg);;Tous (*)") if filename: m_key, ok = QInputDialog.getText(self, "Enter your passphrase", "Key:", QLineEdit.Normal) if ok and m_key != '': lname = os.path.splitext(filename)[0].split("_")[-1] self.originalfile = filename self.afterfile = lname encryordecry = False sym = False self.myLongTask = Crypto_gpg.Worker(filename, m_key, encryordecry, lname, sym) self.myLongTask.renderedImage.connect(self.updatePixmap) self.myLongTask.isstarted.connect(self.isstarted) self.myLongTask.start() else: QMessageBox.warning(self, appname + version + "Error", ''' You must enter a passphrase ''', QMessageBox.Ok) def isstarted(self, status): if status == "True": self.progress = QProgressDialog("Work in progress...", "Cancel", 0, 0) self.progress.setWindowTitle(appname + version) self.progress.setWindowModality(Qt.ApplicationModal) self.progress.exec() else: self.progress.close()
class MasterForm(QMainWindow): def __init__(self, parent=None): super(MasterForm, self).__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) # Encrypt/Decrypt button self.ui.pushEncrypt.clicked.connect(self.tamponencrypt) self.ui.pushDecrypt.clicked.connect(self.tampondecrypt) self.ui.pushSign.clicked.connect(self.tamponsign) self.ui.pushVerify.clicked.connect(self.tamponverify) # Menu connexions self.ui.actionCopier.triggered.connect(self.ui.plainTextEdit.copy) self.ui.actionColler.triggered.connect(self.ui.plainTextEdit.paste) self.ui.actionCut.triggered.connect(self.ui.plainTextEdit.cut) self.ui.actionCacher.triggered.connect(self.toolbarvisibility) self.ui.actionShow_text_icons.triggered.connect(self.texticonsvisibility) self.ui.actionKeymanager.triggered.connect(keymanager) self.ui.actionInfos_QPyCrypto.triggered.connect(openabout) self.ui.actionInfos_Qt.triggered.connect(self.aboutqt) self.ui.actionChiffrerfichier.triggered.connect(self.encryptfile) self.ui.actionDechiffrerfichier.triggered.connect(self.decryptfile) self.ui.actionChiffrer_un_fichier_Enigma.triggered.connect(self.encryptfileenigma) self.ui.actionD_chiffrer_un_fichier_Enigma.triggered.connect(self.decryptfileenigma) self.ui.actionSigner_un_fichier.triggered.connect(self.signfile) self.ui.actionVerifier_signature.triggered.connect(self.verifysignfile) self.ui.actionVider_Tampon.triggered.connect(self.vidertampon) self.ui.actionOuvrir.triggered.connect(self.ouvrirtexte) self.ui.actionSauver.triggered.connect(self.sauvertexte) self.ui.actionQuitter.triggered.connect(sys.exit) # Menu HASH File: self.ui.actionSHA512.triggered.connect(self.hashfilesha512) self.ui.actionSHA384.triggered.connect(self.hashfilesha384) self.ui.actionSHA256.triggered.connect(self.hashfilesha256) self.ui.actionSHA224.triggered.connect(self.hashfilesha224) self.ui.actionSHA_1.triggered.connect(self.hashfilesha) self.ui.actionMD5_2.triggered.connect(self.hashfilemd5) self.ui.actionMD2.triggered.connect(self.hashfilemd2) self.ui.actionMD4.triggered.connect(self.hashfilemd4) self.ui.actionRIPEMD_160.triggered.connect(self.hashfileripemd_160) self.ui.actionRIPEMD_128.triggered.connect(self.hashfileripemd_128) self.ui.actionWhirlpool.triggered.connect(self.hashfileWhirlpool) self.ui.actionTiger.triggered.connect(self.hashfileTiger) self.ui.actionAdler32.triggered.connect(self.hashfileAdler32) self.ui.actionCRC24.triggered.connect(self.hashfileCrc24) self.ui.actionCRC32.triggered.connect(self.hashfileCrc32) self.ui.actionSHA_3_winner_Keccak_1600.triggered.connect(self.hashfileKeccak_1600) self.ui.actionSHA_3_candidate_Skein_512.triggered.connect(self.hashfileSkein_512) self.ui.actionGOST_34_11.triggered.connect(self.hashfileGOST_34_11) def encryptfileenigma(self): filename, _ = QFileDialog.getOpenFileName(self, "Select the file to encrypt", "", "All Files (*)") if filename: dialog = Fenselectkey(self) if dialog.exec_() == QDialog.Accepted: m_key = dialog.ui.EditPass.text() algorithm = dialog.ui.comboAlgo.currentText() if algorithm == "Serpent-256": algo = "srp" if algorithm == "AES-256": algo = "aes" if algorithm == "Twofish-256": algo = "twf" result = encryptfile(filename, m_key, algo) if result["success"] == "successfully encrypted": QMessageBox.information(self, "Successfully encrypted", "File: " + filename + " is encrypted with " + algorithm, QMessageBox.Ok) else: QMessageBox.information(self, "Encryption Error", "Encryption error: " + result["success"], QMessageBox.Ok) self.ui.statusbar.showMessage("File " + filename + " is encrypted.", 50000) return def decryptfileenigma(self): filename, _ = QFileDialog.getOpenFileName(self, "Select the file to decrypt", "", "Cryptoshop Files (*.cryptoshop);;All Files (*)") if filename: m_key, ok = QInputDialog.getText(self, "Enter your passphrase", "Key:", QLineEdit.Normal) if ok and m_key != '': try: result = decryptfile(filename, m_key) if result["success"] == "successfully decrypted": QMessageBox.information(self, "Successfully Decrypted", "File: " + filename + " encrypted with " + result[ "algorithm"] + " was successfully decrypted", QMessageBox.Ok) else: QMessageBox.warning(self, "Decryption Error", "Decryption Error " + result["success"], QMessageBox.Ok) except Exception as e: QMessageBox.warning(self, appname + version + "What that bug ??", (str(e)), QMessageBox.Ok) def signfile(self): filename, _ = QFileDialog.getOpenFileName(self, "Select a file to sign", "", "All files (*)") if filename: gpg = gnupg.GPG(use_agent=False) gpg.encoding = 'utf-8' dialog = Fenselectsignkey(self) if dialog.exec_() == QDialog.Accepted: keyid = dialog.ui.comboBox.currentText() key = dialog.ui.editKey.text() with open(filename, 'rb') as data: signed_data = gpg.sign_file(file=data, keyid=keyid, output=filename + ".sig", detach=True) print(signed_data) data.close() def verifysignfile(self): filename, _ = QFileDialog.getOpenFileName(self, "Select the sig file", "", "sig Files (*.sig);;asc Files (*.asc);;All Files (*)") if filename: with open(filename, 'rb') as stream: gpg = gnupg.GPG(use_agent=False) gpg.encoding = 'utf-8' data = os.path.splitext(filename)[0].split("_")[-1] verified = gpg.verify_file(stream, data) stream.close() if verified.valid is True: QMessageBox.information(self, appname + version + "Good Signature", "Good signature from: " + verified.username + "\n\nFingerprint: " + verified.fingerprint + "\nKey Id: " + verified.key_id + "\nThe signature was created at " + verified.creation_date + "\n\nTrust :" + verified.trust_text, QMessageBox.Ok) return if verified.valid is False and verified.username is None: QMessageBox.warning(self, appname + version + "No signature found", "No signature found: " + verified.stderr, QMessageBox.Ok) return else: QMessageBox.warning(self, appname + version + "Bad Signature", "Bad signature from: " + verified.username + "\nKey Id: " + verified.key_id + "\n\nTHE FILE IS CORRUPTED." + "\n\nDetails :\n" + verified.stderr, QMessageBox.Ok) def tamponverify(self): texttoverify = self.ui.plainTextEdit.toPlainText() gpg = gnupg.GPG(use_agent=False) gpg.encoding = 'utf-8' verified_data = gpg.verify(texttoverify) if verified_data.valid is False and verified_data.status is None: QMessageBox.warning(self, "No valid signature", "No valid signature.", QMessageBox.Ok) return if verified_data.valid is False: QMessageBox.warning(self, appname + version + "Bad Signature", "BAD SIGNATURE " + "\nDATA ARE CORRUPTED:\n\n" + "GnuPG Message: \n" + verified_data.stderr, QMessageBox.Ok) return if verified_data.valid is True: QMessageBox.information(self, appname + version + "Good Signature", "Good signature from: " + verified_data.username + "\nID " + verified_data.key_id + "\n\nFingerprint: \n" + verified_data.fingerprint + "\n\nGnuPG Message:\n" + verified_data.stderr, QMessageBox.Ok) else: QMessageBox.warning(self, appname + version + "Error", " Error ", QMessageBox.Ok) def updatePixmap(self, boll): if boll == "False": QMessageBox.warning(self, appname + version + "Error", " Wrong passphrase " + self.originalfile, QMessageBox.Ok) return else: self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Cryptoshop-->The file " + self.originalfile + " is decrypted") self.ui.plainTextEdit.appendPlainText(str("----->>>") + self.afterfile) def tamponsign(self): texttosign = self.ui.plainTextEdit.toPlainText() gpg = gnupg.GPG(use_agent=False) dialog = Fenselectsignkey(self) if dialog.exec_() == QDialog.Accepted: key = dialog.ui.comboBox.currentText() signed_data = gpg.sign(texttosign, keyid=key) if str(signed_data) == "": QMessageBox.critical(self, appname + version + "Can't Sign...", '''The passphrase is invalid for unlock this key.''', QMessageBox.Ok) return self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(str(signed_data)) def toolbarvisibility(self): if self.ui.actionCacher.isChecked(): self.ui.toolBar.hide() else: self.ui.toolBar.show() def texticonsvisibility(self): if self.ui.actionShow_text_icons.isChecked(): self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) else: self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly) def hidetexticons(self): self.ui.toolBar.setToolButtonStyle(Qt.ToolButtonIconOnly) def encryptfile(self): filename, _ = QFileDialog.getOpenFileName(self, "Select file to encrypt", "", "All (*)") if filename: dialog = Fenselectkeygpg(self) if dialog.exec_() == QDialog.Accepted: m_key = dialog.ui.editKey.text().strip() if dialog.ui.checkSymetric.isChecked(): if dialog.ui.editKey.text() == "": QMessageBox.warning(self, appname + version + "Error...", '''You must type a passphrase.''', QMessageBox.Ok) return encryordecry = True lname = "not used for encrypt" sym = True self.originalfile = filename self.myLongTask = Crypto_gpg.Worker(filename, m_key, encryordecry, lname, sym) self.myLongTask.renderedImage.connect(self.updatePixmap) self.myLongTask.isstarted.connect(self.isstarted) self.myLongTask.start() QMessageBox.warning(self, appname + version + "The file is encrypted", filename + ".gpg", QMessageBox.Ok) else: sym = False item = dialog.ui.comboBox.currentText() print(item) gpg = gnupg.GPG(use_agent=False) keylist = gpg.list_keys() uid_strings = [] uid_string2key = {} for key in keylist: for uid_string in key['uids']: uid_strings.append(uid_string) uid_string2key[uid_string] = key uid = item m_key = uid_string2key[uid] encryordecry = True lname = "not used for encrypt" sym = False self.myLongTask = Crypto_gpg.Worker(filename, m_key, encryordecry, lname, sym) self.myLongTask.renderedImage.connect(self.updatePixmap) self.myLongTask.isstarted.connect(self.isstarted) self.myLongTask.start() self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Cryptoshop-->The file is encrypted.") self.ui.plainTextEdit.appendPlainText(str(filename + ".gpg")) def aboutqt(self): QMessageBox.aboutQt(self, appname + version + "Qt is the best !") def tamponencrypt(self): dialog = Fenselectkeygpg(self) if dialog.exec_() == QDialog.Accepted: self.m_key = dialog.ui.editKey.text().strip() if dialog.ui.checkSymetric.isChecked(): if dialog.ui.editKey.text() == "": QMessageBox.warning(self, appname + version + "Error", '''You must type a passphrase.''', QMessageBox.Ok) return gpg = gnupg.GPG(use_agent=False) plaintext = self.ui.plainTextEdit.toPlainText() crypted = gpg.encrypt(plaintext, False, passphrase=self.m_key, symmetric='AES256', armor=True) self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(str(crypted)) else: item = dialog.ui.comboBox.currentText() print(item) gpg = gnupg.GPG() keylist = gpg.list_keys() uid_strings = [] uid_string2key = {} for key in keylist: for uid_string in key['uids']: uid_strings.append(uid_string) uid_string2key[uid_string] = key uid = item key = uid_string2key[uid] unencrypted_string = self.ui.plainTextEdit.toPlainText() encrypted_data = gpg.encrypt(unencrypted_string, key['fingerprint'], always_trust=True) encrypted_string = str(encrypted_data) self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(encrypted_string) def sauvertexte(self): filename, _ = QFileDialog.getSaveFileName(self) if filename: file = QFile(filename) if not file.open(QFile.WriteOnly | QFile.Text): QMessageBox.critical(self, appname + version + "Save", "Writing Error %s:\n%s." % (filename, file.errorString())) return outstr = QTextStream(file) outstr << self.ui.plainTextEdit.toPlainText() QMessageBox.information(self, appname + version + "Save file", "The file is saved. \n%s" % (file.fileName())) def ouvrirtexte(self): filename, _ = QFileDialog.getOpenFileName(self) if filename: file = QFile(filename) if not file.open(QFile.ReadOnly | QFile.Text): QMessageBox.critical(self, appname + version + "Open File", "Reading Error %s:\n%s." % (filename, file.errorString())) return instr = QTextStream(file) self.ui.plainTextEdit.setPlainText(instr.readAll()) def vidertampon(self): self.ui.plainTextEdit.clear() def tampondecrypt(self): encrypted_string = str(self.ui.plainTextEdit.toPlainText()) gpg = gnupg.GPG(use_agent=False) decrypted_data = gpg.decrypt(encrypted_string) if decrypted_data.ok is True: self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText(str(decrypted_data)) else: QMessageBox.warning(self, appname + version + "Invalid passphrase", ''' Invalid passphrase.''', QMessageBox.Ok) return def hashfileripemd_160(self): filename, _ = QFileDialog.getOpenFileName(self, "RIPEMD-160: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'RIPEMD-160') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-160 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileripemd_128(self): filename, _ = QFileDialog.getOpenFileName(self, "RIPEMD-128: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'RIPEMD-128') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash RIPEMD-128 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilemd2(self): filename, _ = QFileDialog.getOpenFileName(self, "MD2: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'MD2') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash MD2 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilemd4(self): filename, _ = QFileDialog.getOpenFileName(self, "MD4: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'MD4') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash MD4 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilemd5(self): filename, _ = QFileDialog.getOpenFileName(self, "MD5: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'MD5') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash MD5 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha512(self): filename, _ = QFileDialog.getOpenFileName(self, "SHA-512: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-512') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-512 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha384(self): filename, _ = QFileDialog.getOpenFileName(self, "SHA-384: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-384') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-384 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha256(self): filename, _ = QFileDialog.getOpenFileName(self, "SHA-256: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-256') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-256 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha224(self): filename, _ = QFileDialog.getOpenFileName(self, "SHA-224: Select File", "", "All Files (*);;Text Files (*.txt)") if filename: output = simplehash.get_file_checksum(filename, 'SHA-224') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-224 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfilesha(self): filename, _ = QFileDialog.getOpenFileName(self, "SHA-1: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'SHA-1') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-1 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileWhirlpool(self): filename, _ = QFileDialog.getOpenFileName(self, "Whirlpool: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Whirlpool') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Whirlpool -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileTiger(self): filename, _ = QFileDialog.getOpenFileName(self, "Tiger: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Tiger') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Tiger -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileAdler32(self): filename, _ = QFileDialog.getOpenFileName(self, "Adler32: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Adler32') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Adler32 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileCrc24(self): filename, _ = QFileDialog.getOpenFileName(self, "Crc24: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'CRC24') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash CRC24 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileCrc32(self): filename, _ = QFileDialog.getOpenFileName(self, "Crc32: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'CRC32') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash CRC32 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileKeccak_1600(self): filename, _ = QFileDialog.getOpenFileName(self, "SHA-3 Keccak-1600: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Keccak-1600') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash SHA-3 Keccak-1600 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileSkein_512(self): filename, _ = QFileDialog.getOpenFileName(self, "Skein_512: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'Skein-512') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash Skein-512 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def hashfileGOST_34_11(self): filename, _ = QFileDialog.getOpenFileName(self, "GOST 34.11: Select File", "", "All Files (*);;Text Files (*.txt)", ) if filename: output = simplehash.get_file_checksum(filename, 'GOST-34.11') self.ui.plainTextEdit.clear() self.ui.plainTextEdit.appendPlainText("----------------------------------------------") self.ui.plainTextEdit.appendPlainText("Hash GOST 34.11 -->" + filename) self.ui.plainTextEdit.appendPlainText(output) def decryptfile(self): filename, _ = QFileDialog.getOpenFileName(self, "Select encrypted file", "", "GPG files (*.gpg);;Tous (*)") if filename: m_key, ok = QInputDialog.getText(self, "Enter your passphrase", "Key:", QLineEdit.Normal) if ok and m_key != '': lname = os.path.splitext(filename)[0].split("_")[-1] self.originalfile = filename self.afterfile = lname encryordecry = False sym = False self.myLongTask = Crypto_gpg.Worker(filename, m_key, encryordecry, lname, sym) self.myLongTask.renderedImage.connect(self.updatePixmap) self.myLongTask.isstarted.connect(self.isstarted) self.myLongTask.start() else: QMessageBox.warning(self, appname + version + "Error", ''' You must enter a passphrase ''', QMessageBox.Ok) def isstarted(self, status): if status == "True": self.progress = QProgressDialog("Work in progress...", "Cancel", 0, 0) self.progress.setWindowTitle(appname + version) self.progress.setWindowModality(Qt.ApplicationModal) self.progress.exec() else: self.progress.close()
class TLabAppQt(QWidget, McSimulationRunner): """""" def __init__(self, name, env_config, instr_params, gui=True, dummy=False, vr_name=''): QWidget.__init__(self, env_config=env_config, instr_params=instr_params) self.gui = gui self.dummy = dummy self.vr_name = vr_name self.progress_dialog = None self.timer = None self.time_passed = 0. self.steps_passed = 0 self.log_scale_y = False self.sq_scale_x = False self.sim_status = '1/2 Подготовка' self.timer_p_int = self.configuration['Simulation poll timer'] # mcsec if not gui: return # setting up the figure and its canvas for plots self.figure = Figure() self.canvas = FigureCanvas(self.figure) self.toolbar = NavigationToolbar(self.canvas, self) self.canvas.setFixedWidth(self.configuration['Plot Width']) self.canvas.setFixedHeight(self.configuration['Plot Height']) # setting up plot axes if ('1D detector file name' in self.configuration) and ('2D detector file name' in self.configuration): self.axes_1d_detector, self.axes_2d_detector = self.canvas.figure.subplots( nrows=1, ncols=2) elif '1D detector file name' in self.configuration: self.axes_1d_detector = self.canvas.figure.subplots() self.axes_2d_detector = None elif '2D detector file name' in self.configuration: self.axes_1d_detector = None self.axes_2d_detector = self.canvas.figure.subplots() self.figure.tight_layout() # adding plot scale button and registering click callback self.log_by = QPushButton('Лог. интенсивность') self.log_by.setFixedWidth(0.2 * self.configuration['Plot Width']) self.log_by.clicked.connect(self.on_btn_log_y) self.sq_bx = QPushButton('Кв. ось x') self.sq_bx.setFixedWidth(0.2 * self.configuration['Plot Width']) self.sq_bx.clicked.connect(self.on_btn_sq_x) # adding the button to run the fit app self.fit_b = QPushButton('Анализ результатов') self.fit_b.setFixedWidth(0.2 * self.configuration['Plot Width']) self.fit_b.clicked.connect(self.on_btn_fit) self.save_b = QPushButton('Сохранить результаты') self.save_b.setFixedWidth(0.2 * self.configuration['Plot Width']) self.save_b.clicked.connect(self.on_btn_save) # adding simulation parameters buttons and labels self.param_buttons, self.param_labels = [], [] for i, param in enumerate(self.instr_params): self.param_buttons.append(QPushButton(param.gui_name)) self.param_labels.append(QLabel(str(param))) self.param_labels[i].setFrameStyle(QFrame.Sunken | QFrame.Panel) self.param_buttons[i].clicked.connect(self.make_callback(i)) # adding "Simulate" button and registering click callback self.run_b = QPushButton('Запуск эксперимента') self.run_b.clicked.connect(self.on_btn_run) # adding instrument scheme picture p_map = QPixmap(self.configuration['instrument scheme']) p_map = p_map.scaledToHeight(200, Qt.SmoothTransformation) scheme_label = QLabel() scheme_label.setPixmap(p_map) # setting up Qt window layout main_layout = QHBoxLayout() param_layout = QGridLayout() plot_layout = QVBoxLayout() tbr_layout = QHBoxLayout() log_layout = QVBoxLayout() u_plot_layout = QHBoxLayout() tbr_layout.addWidget(self.toolbar, 0) log_layout.addWidget(self.log_by, 0) log_layout.addWidget(self.sq_bx, 1) tbr_layout.addLayout(log_layout, 1) plot_layout.addLayout(tbr_layout, 0) plot_layout.addWidget(self.canvas, 1) u_plot_layout.addWidget(self.fit_b, 0, Qt.AlignRight) u_plot_layout.addWidget(self.save_b, 1, Qt.AlignLeft) plot_layout.addLayout(u_plot_layout, 3) plot_layout.addWidget(scheme_label, 4, Qt.AlignCenter) for i, param in enumerate(self.instr_params): param_layout.addWidget(self.param_buttons[i], i, 0) param_layout.addWidget(self.param_labels[i], i, 1) param_layout.addWidget(self.run_b, len(self.instr_params), 1) main_layout.addLayout(param_layout, 0) main_layout.addLayout(plot_layout, 1) self.setLayout(main_layout) self.setWindowTitle(name) def send_params(self, status='', params=True): if not self.configuration['Send VR Data']: return msg = dict() msg['id'] = self.vr_name if status: msg['id'] += '_' + status if status == 'nextstep': for param in self.instr_params: if type(param.dtype) == ValueRange: msg['next' + param.vr_name] = param.value.start + (param.value.end - param.value.start) * \ float(self.steps_passed) / self.n_points if self.vr_name == 'stoik': msg['curstep'] = self.steps_passed break if params: for param in self.instr_params: if type(param.dtype) == ValueRange: msg[param.vr_name + 'start'] = param.value.start msg[param.vr_name + 'end'] = param.value.end else: msg[param.vr_name] = param.value msg = json.dumps(msg) async def send_data(data): async with websockets.connect( self.configuration['VR server uri']) as websocket: await websocket.send(data) try: asyncio.get_event_loop().run_until_complete(send_data(msg)) print('Sent', self.configuration['VR server uri'], 'data', msg) except (OSError, asyncio.exceptions.TimeoutError) as e: print(e) def make_callback(self, ii): if self.instr_params[ii].value_names: def callback(): item, ok = QInputDialog.getItem( self, self.instr_params[ii].gui_name, self.instr_params[ii].gui_name, self.instr_params[ii].value_names, self.instr_params[ii].values.index( self.instr_params[ii].value), False) if ok: self.instr_params[ii].update_by_name(item) self.param_labels[ii].setText("%s" % str(self.instr_params[ii])) self.send_params() elif self.instr_params[ii].dtype == int: def callback(): res, ok = QInputDialog.getInt(self, self.instr_params[ii].gui_name, self.instr_params[ii].gui_name, self.instr_params[ii].value) if ok: self.instr_params[ii].update(res) self.param_labels[ii].setText("%s" % str(self.instr_params[ii])) self.send_params() elif self.instr_params[ii].dtype == float: def callback(): d, ok = QInputDialog.getDouble(self, self.instr_params[ii].gui_name, self.instr_params[ii].gui_name, self.instr_params[ii].value) if ok: self.instr_params[ii].update(d) self.param_labels[ii].setText("%s" % str(self.instr_params[ii])) self.send_params() elif type(self.instr_params[ii].dtype) == ValueRange: def callback(): text, ok = QInputDialog.getText(self, self.instr_params[ii].gui_name, self.instr_params[ii].gui_name, QLineEdit.Normal, str(self.instr_params[ii])) if ok and text != '': self.instr_params[ii].update(text) self.param_labels[ii].setText("%s" % str(self.instr_params[ii])) self.send_params() else: def callback(): pass print(self.instr_params[ii].dtype) return callback def _update_plot_axes(self): if self.axes_1d_detector: self.axes_1d_detector.clear() self.axes_1d_detector.set_title(self.result1d.title) self.axes_1d_detector.set_xlabel(self.result1d.xlabel) self.axes_1d_detector.set_ylabel(self.result1d.ylabel) if self.log_scale_y: self.axes_1d_detector.set_yscale('log') else: self.axes_1d_detector.set_yscale('linear') if self.sq_scale_x: self.axes_1d_detector.errorbar(np.sqrt(self.result1d.xdata), self.result1d.ydata, yerr=self.result1d.yerrdata, zorder=1) self.axes_1d_detector.xaxis.set_major_formatter( ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x**2))) else: self.axes_1d_detector.errorbar(self.result1d.xdata, self.result1d.ydata, yerr=self.result1d.yerrdata, zorder=1) self.axes_1d_detector.xaxis.set_major_formatter( ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x))) if self.axes_2d_detector: self.axes_2d_detector.clear() self.axes_2d_detector.set_title(self.result2d.title) self.axes_2d_detector.set_xlabel(self.result2d.xlabel) self.axes_2d_detector.set_ylabel(self.result2d.ylabel) if self.log_scale_y: self.axes_2d_detector.imshow(np.log(self.result2d.data), extent=self.result2d.extent) else: self.axes_2d_detector.imshow(self.result2d.data, extent=self.result2d.extent) self.figure.tight_layout() self.canvas.draw() def on_timeout_dummy(self): self.time_passed += 1E-3 * self.timer_p_int self.progress_dialog.setValue( int(100. * self.time_passed / self.sim_eta)) self.progress_dialog.setLabelText( self.sim_status + ": %d сек" % (self.sim_eta - int(self.time_passed))) def on_timeout(self): status = self.sim_process.poll() if status is not None: self.progress_dialog.setValue(self.progress_dialog.maximum()) print('Child process returned', status) return self.time_passed += 1E-3 * self.timer_p_int self.sim_stdout.flush() self.sim_stderr.flush() try: out_line = self.sim_stdout.readline().decode() except Exception: out_line = '' try: err_line = self.sim_stderr.readline().decode() except Exception: err_line = '' if out_line: print(out_line) if err_line: print(err_line) m = re.match(r'Trace ETA (?P<mes>[\d.]+) \[(?P<scale>min|s|h)\]', out_line) if m: self.time_passed = 0. if self.sim_status != '2/2 Вычисление': self.sim_status = '2/2 Вычисление' if m.group('scale') == 's': self.sim_eta = float(m.group('mes')) elif m.group('scale') == 'min': self.sim_eta = float(m.group('mes')) * 60. elif m.group('scale') == 'h': self.sim_eta = float(m.group('mes')) * 3600. else: if m.group('scale') == 's': self.sim_eta = max(self.sim_eta, float(m.group('mes'))) elif m.group('scale') == 'min': self.sim_eta = max(self.sim_eta, float(m.group('mes')) * 60.) elif m.group('scale') == 'h': self.sim_eta = max(self.sim_eta, float(m.group('mes')) * 3600.) if (self.n_points == 1) or (self.sim_status == '1/2 Подготовка'): self.progress_dialog.setValue( int(100. * self.time_passed / self.sim_eta)) self.progress_dialog.setLabelText( self.sim_status + ": %d сек" % (self.sim_eta - int(self.time_passed))) m = re.match(r'INFO: (?P<param>[\S.]+): (?P<val>[\d.]+)$', err_line) if m: self.sim_status = '2/2 Вычисление' self.steps_passed += 1 self.send_params(status='nextstep', params=False) if (self.n_points > 1) and (self.sim_status == '2/2 Вычисление'): self.progress_dialog.setValue( int(100. * self.steps_passed / self.n_points)) self.progress_dialog.setLabelText( self.sim_status + ": %d / %d шагов" % (int(self.steps_passed), self.n_points)) def await_simulation(self): if self.sim_process is None: return self.sim_eta = self.configuration['Compilation ETA'] self.time_passed = 0. self.steps_passed = 0 self.sim_status = '1/2 Подготовка' self.progress_dialog = QProgressDialog('Ход эксперимента', 'Стоп', 0, 100) self.progress_dialog.resize(300, self.progress_dialog.height()) self.progress_dialog.canceled.connect(self.kill_simulation) self.timer = QTimer() self.timer.timeout.connect(self.on_timeout) self.timer.start(self.timer_p_int) self.progress_dialog.exec() self.timer.stop() self.sim_process.wait() def on_btn_run(self, *args, **kwargs): self.send_params(status='experiment', params=True) if self.dummy: self.update_sim_results( self.configuration['Backup Data Directory']) self.sim_eta = self.configuration['Dummy ETA'] self.time_passed = 0. self.steps_passed = 0 self.sim_status = 'Вычисление' self.progress_dialog = QProgressDialog('Ход эксперимента', 'Стоп', 0, 100) self.progress_dialog.resize(300, self.progress_dialog.height()) self.timer = QTimer() self.timer.timeout.connect(self.on_timeout_dummy) self.timer.start(self.timer_p_int) self.progress_dialog.exec() self.timer.stop() self._update_plot_axes() self.send_params(status='experiment_end', params=False) return self.open_simulation(*args, **kwargs) self.await_simulation() if self.sim_process.poll() >= 0: self.update_sim_results() self._update_plot_axes() self._cleanup() self.send_params(status='experiment_end', params=False) else: self.send_params(status='experiment_cancel', params=False) def on_btn_log_y(self, *args): self.log_scale_y = not self.log_scale_y if self.log_scale_y: self.log_by.setText('Лин. интенсивность') else: self.log_by.setText('Лог. интенсивность') self._update_plot_axes() def on_btn_sq_x(self, *args): self.sq_scale_x = not self.sq_scale_x if self.sq_scale_x: self.sq_bx.setText('Лин. ось x') else: self.sq_bx.setText('Кв. ось x') self._update_plot_axes() def on_btn_fit(self, *args): if self.axes_1d_detector is not None and len(self.result1d.xdata) > 0: fit_app = TFitAppQt(self.result1d) fit_app.show() def on_btn_save(self, *args): options = QFileDialog.Options() | QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName( self, "Сохранить файл", "", "All Files (*);;Text Files (*.txt)", options=options) if fileName: print('Results saved to %s' % fileName) np.savetxt( fileName, np.stack((self.result1d.xdata, self.result1d.ydata, self.result1d.yerrdata)).T)