pyqt5的文件加密解密程序,用到base64,rsa和aes進行混合解密,代碼比較雜亂,可自行整理,僅供學習參考之用,如需轉載,請聯系博主或附上博客鏈接,下面直接干貨。
程序截圖如下:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'hellopyqt5.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! # -*- coding: utf-8 -*- # coding: utf-8 import os import sys import zlib import time import random from os import path from PIL import Image from glob import glob from PyQt5.QtGui import QIcon from PyQt5.QtGui import QFont from PyQt5.QtWidgets import QPushButton from PyQt5.QtWidgets import QFileDialog from PyQt5.QtWidgets import QMessageBox from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QFrame from PyQt5.QtWidgets import QWidget from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import QThread from PyQt5.QtCore import pyqtSignal from PyQt5 import QtWidgets, QtCore from PyQt5.QtGui import QIcon,QColor,QPainter,QFontMetricsF,QDrag from PyQt5.QtCore import (QByteArray, QDataStream, QIODevice, QMimeData,QPoint, QSize, Qt) from Crypto.Cipher import AES import base64 import json import codecs import time from Crypto import Random from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 from Crypto.PublicKey import RSA from PIL import Image as ImagePIL, ImageFont, ImageDraw #隨機16位AES密鑰 AES_SECRET_KEY = ''.join(random.sample('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16)) #隨機16位填充碼 IV = ''.join(random.sample('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16)) class AESCrypt: def __init__(self): self.key =AES_SECRET_KEY #只截取16位 self.iv = IV# 16位字符,用來填充缺失內容,可固定值也可隨機字符串,具體選擇看需求。 self.mode=AES.MODE_CBC #CBC好像對中文支持不太好 #self.mode=AES.MODE_EBC def __pad(self, text): """填充方式,加密內容必須為16字節的倍數,若不足則使用self.iv進行填充""" text_length = len(text) amount_to_pad = AES.block_size - (text_length % AES.block_size) if amount_to_pad == 0: amount_to_pad = AES.block_size pad = chr(amount_to_pad) return text + pad * amount_to_pad def __unpad(self, text): pad = ord(text[-1]) return text[:-pad] def encrypt(self, raw): """加密""" raw = self.__pad(raw) cipher = AES.new(str.encode(self.key),self.mode,str.encode(self.iv)) # msg=cipher.encrypt(str.encode(raw)) return base64.b64encode(cipher.encrypt(str.encode(raw))) def decrypt(self, enc): """解密""" enc = base64.b64decode(enc) cipher = AES.new(str.encode(self.key),self.mode,str.encode(self.iv)) return self.__unpad(cipher.decrypt(enc).decode("utf-8")) def change(c): #返回字母數字的對應的 ASCII 數值 num = ord(c) #a的ansii為97,z為122,a~z if num >= 97 and num <= 120: num = 97 + ((num - 97) + 2) #chr返回10進制數字對應的ansii值,也可返回16進制 return chr(num) def dechange(c): num = ord(c) if num >= 97 and num <= 122: num = (num - 97) + 95 #返回字母數字的對應的 ASCII 數值 return chr(num) #選擇文件加密按鈕,支持拖動文件 class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) self.setAcceptDrops(True) droppath=str(23) def dragEnterEvent(self, event): global droppath try: #label4顯示 ui.label_4.setVisible(True) #避免重復點擊,按鈕置為不可用 ui.pushButton_3.setEnabled(False) ui.pushButton_4.setEnabled(False) ui.pushButton.setEnabled(False) ui.pushButton_2.setEnabled(False) ui.pushButton_6.setEnabled(False) droppath=event.mimeData().text() droppath=str(droppath.replace(r'file:///',r'')).replace(r'/',r'\\') #print(droppath) f=os.path.splitext(droppath) #鼠標放開函數事件 event.accept() except Excetion as e: print(e) # 鼠標放開執行 def dropEvent(self, evn): try: global timedrop try: filepath2 = droppath.replace(r'/',r'\\') print(filepath2) if filepath2 != '': try: start=time.time() file = open(filepath2,'rb').read() file_len = len(file) default_length = 200 # 偽隨機數生成器 random_generator = Random.new().read # rsa算法生成實例 rsa = RSA.generate(2048, random_generator) #公鑰加密,也生成文件吧 rsa_public_key = rsa.publickey().exportKey() #公鑰加密 rsakey = RSA.importKey(rsa_public_key) cipher = Cipher_pkcs1_v1_5.new(rsakey) # 密鑰key生成 rsa_private_key = rsa.exportKey() keypath = filepath2 f=os.path.splitext(keypath) newname = f[0] + 'secure' newname = newname+ '.key' with open(newname, 'wb') as f: f.write(rsa_private_key) time.sleep(0.1) #self.rsignal.emit(str(int(10))) #長度不用分段 if file_len < default_length: stringrsa = base64.b64encode(cipher.encrypt(file)) else: #需要分段 offset = 0 res = [] count = 0 while file_len - offset > 0: if file_len - offset > default_length: res.append(cipher.encrypt(file[offset:offset+default_length])) else: res.append(cipher.encrypt(file[offset:])) offset += default_length count = count + 1 #print('計數分段次數:'+ str(count)) time.sleep(0.1) #ui.rsignal.emit(str(int(60))) #stringrsa = '' stringrsa = b''.join(res) stringrsa = base64.b64encode(stringrsa) #ui.rsignal.emit(str(int(90))) #下面進行AES加密 stringaes = AESCrypt() stringaes_comp = stringaes.encrypt(str(stringrsa)) defilepath = filepath2 ft=os.path.splitext(defilepath) newjiami = ft[0] + '-已加密' newjiami = newjiami+ ft[1] with open(newjiami,'wb') as f: f.write(stringaes_comp) print('加密成功') time.sleep(0.1) #ui.rsignal.emit(str(int(100))) end=time.time() timedrop=(format(float(end-start),'.2f')) except Exception as e: print(e) #ui.stop() except Exception as e: print(e) QMessageBox.information(self,"已完成!", "已成功加密文件到原有目錄。" + '\n' +'共耗時:'+str(timedrop)+' '+'秒',QMessageBox.Yes) ui.pushButton_3.setEnabled(True) ui.pushButton_4.setEnabled(True) ui.pushButton.setEnabled(True) ui.pushButton_2.setEnabled(True) #label4隱藏 ui.label_4.setVisible(False) #self.pushButton_4.setVisible(False) ui.pushButton_6.setEnabled(True) except Exception as e: print(e) def dragMoveEvent(self,evn): pass #print('鼠標移入') #可自行增加選擇文件加拖動功能 class Button2(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) self.setAcceptDrops(True) droppath2=str(23) def dragEnterEvent(self, event): if 1==1: QMessageBox.information(ui,"提示", "不支持拖拽文件!",QMessageBox.Yes) # 鼠標放開執行 def dropEvent(self, evn): try: pass#ui.label_6.setText(dropfile) except Exception as e: print(e) def dragMoveEvent(self,evn): pass #print('鼠標移入') #可自行增加選擇key加拖動功能 class Button3(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) self.setAcceptDrops(True) #droppath2=str(23) def dragEnterEvent(self, event): #global dropkey try: if 1==1: QMessageBox.information(ui,"提示", "不支持拖拽文件!",QMessageBox.Yes) event.accept() except Excetion as e: print(e) # 鼠標放開執行 def dropEvent(self, evn): try: pass#event.accept() except Exception as e: print(e) def dragMoveEvent(self,evn): pass #print('鼠標移入') #播放音樂類 #openpic類 class Runthreadmusic(QtCore.QThread): # 通過類成員對象定義信號對象 rsignal = pyqtSignal(str) def __init__(self): super(Runthreadmusic, self).__init__() self.flag = 1 def __del__(self): self.wait() def stop(self): self.flag=0 print('線程退出了') def run(self): if self.flag==1: try: musicfile=musicpath[0].replace(r'/',r'\\') audio = MP3(musicfile) musiclen=audio.info.length playsound=pygame.mixer.music.load(musicfile) pygame.mixer.music.play() fenge=("{:.0f}".format(musiclen)) fen=("{:.2f}".float(100/float(fenge))) for i in (1,101): self.rsignal.emit(str(float(i)*float(fen))) except Exception as e: print(e) #拖動文件drop類 class Runthreaddrop(QtCore.QThread): # 通過類成員對象定義信號對象 rsignal = pyqtSignal(str) def __init__(self): super(Runthreaddrop, self).__init__() self.flag = 1 def __del__(self): self.wait() def stop(self): self.flag=0 print('線程退出了') def run(self): if self.flag==1: try: print('進入線程') path=str(droppath) if path!= '': try: im = Image.open(path) # 打開圖片 imBytes = im.tobytes() # 把圖片轉換成bytes流 imBytes = zlib.compress(imBytes, 9) # 對圖像字節串進行壓縮,第二個參數是壓縮率有-1,0-9. if im.mode == 'RGBA': im2 = Image.frombytes('RGBA',im.size, zlib.decompress(imBytes)) # 壓縮成新的圖片 else: im2 = Image.frombytes('RGB',im.size, zlib.decompress(imBytes)) f=os.path.splitext(path) newname=f[0] + '-已壓縮' newname=newname+f[1] im2.save(newname) self.rsignal.emit(str(int(100))) except Exception as e: print(e) self.stop() except Exception as e: print(e) #解密類 class Runthreadjiemi(QtCore.QThread): # 通過類成員對象定義信號對象 rsignal = pyqtSignal(str) def __init__(self): super(Runthreadjiemi, self).__init__() self.flag = 1 def __del__(self): self.wait() def stop(self): self.flag=0 print('線程退出了') def run(self): if self.flag==1: global usedtime4 try: try: start=time.time() watebytes = open(jiemifile[0],'rb').read() #第一步先AES解密 deaes = AESCrypt() destring = watebytes.decode() watebytes = deaes.decrypt(destring) time.sleep(0.1) #補等號 missing_padding = len(watebytes) % 4 #print(missing_padding) if missing_padding != 0: #print('需要補等號') #string_new = bytes(file, encoding='utf-8') watebytes = str(watebytes).replace("b'","").replace("'","") watebytes += '=' * (4 - missing_padding) self.rsignal.emit(str(int(33))) #第二步base64解密 try: watebytes =bytes(watebytes,encoding='utf-8') stringbyte = base64.b64decode(watebytes)#.encode('utf-8')) #print(stringbyte) file2 = stringbyte length2 = len(file2) #print(length2) default_length2 = 256 rsa_private_key=open(jiemikey[0],'rb').read() rsakey2=RSA.importKey(rsa_private_key) self.rsignal.emit(str(int(66))) except Exception as e: if e == 'Incorrect padding': QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) else: QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) time.sleep(0.1) #第三部RSA私鑰解密 cipher2 = Cipher_pkcs1_v1_5.new(rsakey2) #長度不用分段 if length2 < default_length2: string_write = b''.join(cipher2.decrypt(file2,None)) else: #需要分段 offset2 = 0 res2 = [] while length2 - offset2 > 0: if length2 - offset2 > default_length2: res2.append(cipher2.decrypt(file2[offset2:offset2+default_length2],None)) else: res2.append(cipher2.decrypt(file2[offset2:],None)) offset2 += default_length2 self.rsignal.emit(str(int(80))) string_write = b''.join(res2) jiemipath = jiemifile[0] f=os.path.splitext(jiemipath) newname=f[0] + '-已解密' newname=newname+f[1] with open(newname,'wb') as f: f.write(string_write) print('解密成功') #信號傳給進度條100%了 self.rsignal.emit(str(int(100))) except Exception as e: print(e) end=time.time() usedtime4=(format(float(end-start),'.2f')) #print("共耗時: %.02f 秒" %(float(usedtime4))) self.stop() except UnicodeError: QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) except UnicodeEncodeError: QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) except UnicodeDecodeError: QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) except UnicodeTranslateError: QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) except IOError: QMessageBox.information(ui,"錯誤", "不能寫入文件,請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) except BaseException: QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) except Exception as e: print(e) if e == "'utf-8' codec can't decode byte 0xff in position 0: invalid start byte": QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) else: QMessageBox.information(ui,"錯誤", "請選擇正確的加密文件和key密鑰!",QMessageBox.Yes) #opendic類 class Runthreaddic(QtCore.QThread): # 通過類成員對象定義信號對象 rsignal = pyqtSignal(str) def __init__(self): super(Runthreaddic, self).__init__() self.flag = 1 def __del__(self): self.wait() def stop(self): self.flag=0 print('線程退出了') def run(self): if self.flag==1: global usedtime2 try: path=dic.replace(r'/',r'\\') # glob.glob()用來進行模糊查詢,增加參數recursive=True后可以使用**/來匹配所有子目錄 files = glob( path + "**/*.JPG", recursive=True) + glob(path + "**/*.bmp", recursive=True) + glob(path + "**/*.png", recursive=True) total = len(files) #總文件數 cur = 1 #當前文件序號 i=1 start=time.time() for infile in files: try: #f, ext = os.path.splitext(infile) # 分離文件名和后綴 #print("進度:" + str(cur) + "/" + str(total) + " " + infile) img = Image.open(infile) # 打開圖片文件 if img.width>5: width=img.width height=img.height size=(width*bs,height*bs) img.thumbnail(size, Image.ANTIALIAS) # 使用抗鋸齒模式生成縮略圖(壓縮圖片) f=os.path.splitext(infile) newname=f[0] + '-已壓縮' newname=newname+f[1] #不指定編碼格式 img.save(newname) # , "JPEG"infile保存成與原文件名一致的文件,會自動覆蓋源文件 bfb=int(100/total) if i==total: self.rsignal.emit(str(int(100))) self.quit() else: self.rsignal.emit(str(bfb*i)) i=i+1 else: print(infile + "寬度小於1200px,無需處理,已忽略") cur = cur + 1 except Exception as e: print(e) end=time.time() usedtime2=(format(float(end-start),'.2f')) #print("共耗時: %.02f 秒" %(float(usedtime2))) self.stop() except Exception as e: print(e) #加密類 class Runthreadjiami(QtCore.QThread): # 通過類成員對象定義信號對象 rsignal = pyqtSignal(str) def __init__(self): super(Runthreadjiami, self).__init__() self.flag = 1 def __del__(self): self.wait() def stop(self): self.flag=0 print('線程退出了') def run(self): if self.flag==1: global usedtime3 try: filepath2 = filepath.replace(r'/',r'\\') if filepath2 != '': try: start=time.time() file = open(filepath2,'rb').read() file_len = len(file) default_length = 200 # 偽隨機數生成器 random_generator = Random.new().read # rsa算法生成實例 rsa = RSA.generate(2048, random_generator) #公鑰加密,也生成文件吧 rsa_public_key = rsa.publickey().exportKey() #print(rsa_public_key) #with open('01.pub', 'wb') as f: # f.write(rsa_public_key) #公鑰加密 rsakey = RSA.importKey(rsa_public_key) cipher = Cipher_pkcs1_v1_5.new(rsakey) # 密鑰key生成 rsa_private_key = rsa.exportKey() #print(rsa_private_key) #f=os.path.splitext(path) #newname=f[0] + '-已壓縮' #newname=newname+ '.key' keypath = filepath2 f=os.path.splitext(keypath) newname = f[0] + 'secure' newname = newname+ '.key' with open(newname, 'wb') as f: f.write(rsa_private_key) time.sleep(0.1) self.rsignal.emit(str(int(20))) #長度不用分段 if file_len < default_length: stringrsa = base64.b64encode(cipher.encrypt(file)) else: #需要分段 offset = 0 res = [] count = 0 while file_len - offset > 0: if file_len - offset > default_length: res.append(cipher.encrypt(file[offset:offset+default_length])) else: res.append(cipher.encrypt(file[offset:])) offset += default_length count = count + 1 #print('計數分段次數:'+ str(count)) time.sleep(0.1) self.rsignal.emit(str(int(60))) #stringrsa = '' stringrsa = b''.join(res) stringrsa = base64.b64encode(stringrsa) self.rsignal.emit(str(int(80))) #下面進行AES加密 stringaes = AESCrypt() stringaes_comp = stringaes.encrypt(str(stringrsa)) defilepath = filepath2 ft=os.path.splitext(defilepath) newjiami = ft[0] + '-已加密' newjiami = newjiami+ ft[1] with open(newjiami,'wb') as f: f.write(stringaes_comp) print('加密成功') time.sleep(0.1) self.rsignal.emit(str(int(100))) end=time.time() usedtime3=(format(float(end-start),'.2f')) except Exception as e: print(e) self.stop() except Exception as e: print(e) #opendicno類 class Runthreaddicno(QtCore.QThread): # 通過類成員對象定義信號對象 rsignal = pyqtSignal(str) #signal2 = pyqtSignal(str) def __init__(self): super(Runthreaddicno, self).__init__() self.flag = 1 def __del__(self): self.wait() def stop(self): self.flag=0 #self.msgbox1=msgbox() #self.newmsg=msgbox1.msg() print('線程退出了') def run(self): global usedtime if self.flag==1: try: path=dic.replace(r'/',r'\\') if dic != '': path=dic.replace(r'/',r'\\') # glob.glob()用來進行模糊查詢,增加參數recursive=True后可以使用**/來匹配所有子目錄 files = glob( path + "**/*.JPG", recursive=True) + glob(path + "**/*.bmp", recursive=True) + glob(path + "**/*.png", recursive=True) total = len(files) #總文件數 print(total) cur = 1 #當前文件序號 i=1 print(files) start=time.time() for infile in files: try: #print("進度:" + str(cur) + "/" + str(total) + " " + infile) im = Image.open(infile) # 打開圖片文件 if im.width>5: imBytes = im.tobytes() imBytes = zlib.compress(imBytes, 9) if im.mode == 'RGBA': im2 = Image.frombytes('RGBA', im.size, zlib.decompress(imBytes)) # 壓縮成新的圖片 else: im2 = Image.frombytes('RGB', im.size, zlib.decompress(imBytes)) #改名------------------------ f=os.path.splitext(infile) newname=f[0] + '-已壓縮' newname=newname+f[1] #改名------------------------ im2.save(newname) # 保存成與原文件名一致的文件,會自動覆蓋源文件 bfb=int(100/total) if i==total: self.rsignal.emit(str(int(100))) #os._exit(0)退出整個程序,不好 self.quit() else: self.rsignal.emit(str(bfb*i)) i=i+1 else: print(infile + "寬度小於1200px,無需處理,已忽略") cur = cur + 1 except Exception as e: print(e) end=time.time() usedtime=(format(float(end-start),'.2f')) #print("共耗時: %.02f 秒" %(float(usedtime))) self.stop() except Exception as e: print(e) class Ui_Form(QWidget): # QMainWindow QWidget def __init__(self): super(QWidget,self).__init__() #QtWidgets.QMainWindow self.setupUi(self) self.retranslateUi(self) # 鼠標拖入事件 def setupUi(self, Form): Form.setObjectName("Form") Form.resize(368, 290) Form.setFixedSize(368, 260) Form.setWindowTitle('文件加密解密') Form.setWindowIcon(QIcon(':/1.png')) self.tabWidget = QtWidgets.QTabWidget(Form) self.tabWidget.setGeometry(QtCore.QRect(10, 10, 351, 271)) self.tabWidget.setObjectName("tabWidget") self.tab = QtWidgets.QWidget() #指定顯示特定頁面 #self.tab.setCurrentIndex(0) self.tab.setObjectName("tab") self.pushButton_4 = QtWidgets.QPushButton(self.tab) self.pushButton_4.setGeometry(QtCore.QRect(100, 120, 141, 41)) self.pushButton_4.setObjectName("pushButton_4") self.pushButton_4.clicked.connect(self.opendicno) self.pushButton_4.setVisible(False) #加密文件 self.pushButton_3 = Button("pushButton_3", self.tab) #self.pushButton_3 = QtWidgets.QPushButton(self.tab) self.pushButton_3.setGeometry(QtCore.QRect(120, 110, 101, 41)) self.pushButton_3.setObjectName("pushButton_3") self.pushButton_3.clicked.connect(self.jiami) self.label = QtWidgets.QLabel(self.tab) self.label.setGeometry(QtCore.QRect(20, 0, 281, 81)) self.label.setTextFormat(QtCore.Qt.AutoText) self.label.setWordWrap(True) self.label.setObjectName("label") #進度條1 self.progressBar = QtWidgets.QProgressBar(self.tab) self.progressBar.setGeometry(QtCore.QRect(90, 190, 171, 26)) self.progressBar.setObjectName("progressBar") self.progressBar.setProperty("value", 0) self.progressBar.setStyleSheet("QProgressBar{border:0px solid #00A0E6;" "height:50;" "background:#191C21;" "text-align:right;" "color:white;" #"color:rgb(245,220,0);" "border-radius:2px;}" "QProgressBar::chunk{" #"border-radius:5px;" #"border:1px solid black;"rgb(167,210,102) rgb(245,220,0) "background-color:rgb(150,196,64);" "width:1px;margin:0.5px;}" ) #隱藏進度條 self.progressBar.setVisible(False) self.tabWidget.addTab(self.tab, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") #self.tab_2.setStyleSheet('background-color:#FAEBD7;') #隱藏的Qlineedit self.lineEdit = QtWidgets.QLineEdit(self.tab) self.lineEdit.setGeometry(QtCore.QRect(0, 10, 351, 241)) self.lineEdit.setObjectName("lineEdit") self.lineEdit.setVisible(False) #有損壓縮選擇文件按鈕 self.pushButton = Button2("pushButton", self.tab_2) #self.pushButton = QtWidgets.QPushButton(self.tab_2) self.pushButton.setGeometry(QtCore.QRect(120, 70, 101, 41)) self.pushButton.setCheckable(False) self.pushButton.setObjectName("pushButton") #選擇key支持拖動 self.pushButton.clicked.connect(self.openfile) self.pushButton_2 = Button3("pushButton_2", self.tab_2) #self.pushButton_2 = QtWidgets.QPushButton(self.tab_2) self.pushButton_2.setGeometry(QtCore.QRect(120, 120, 101, 41)) self.pushButton_2.setCheckable(False) self.pushButton_2.setObjectName("pushButton_2") #有損壓縮打開文件夾 self.pushButton_2.clicked.connect(self.opendic) #解密文件按鈕 #self.pushButton_6 = Button3("pushButton_6", self.tab_2) self.pushButton_6 = QtWidgets.QPushButton(self.tab_2) self.pushButton_6.setGeometry(QtCore.QRect(110, 170, 121, 41)) self.pushButton_6.setCheckable(False) self.pushButton_6.setObjectName("pushButton_6") self.pushButton_6.clicked.connect(self.jiemi) ######停止線程 self.pushButton_7 = QtWidgets.QPushButton(self.tab_2) self.pushButton_7.setGeometry(QtCore.QRect(250, 120, 91, 41)) self.pushButton_7.setCheckable(False) self.pushButton_7.setObjectName("pushButton_7") self.pushButton_7.clicked.connect(self.stopjiemi) self.pushButton_7.setVisible(False) self.pushButton_7.setStyleSheet("color:red;""background:#191C21;""font:微軟雅黑;") self.tabWidget.addTab(self.tab_2, "") #label4 self.label_4 = QtWidgets.QLabel(self.tab) self.label_4.setGeometry(QtCore.QRect(20, 170, 161, 16)) font4 = QtGui.QFont() font4.setFamily("微軟雅黑") font4.setPointSize(10) self.label_4.setFont(font4) self.label_4.setObjectName("label_4") self.label_4.setVisible(False) #label5 self.label_5 = QtWidgets.QLabel(self.tab_2) self.label_5.setGeometry(QtCore.QRect(20, 160, 151, 16)) font5 = QtGui.QFont() font5.setFamily("微軟雅黑") font5.setPointSize(10) self.label_5.setFont(font5) self.label_5.setObjectName("label_5") self.label_5.setVisible(False) #label6,7 self.label_6 = QtWidgets.QLabel(self.tab_2) self.label_6.setGeometry(QtCore.QRect(0, 50, 341, 16)) self.label_6.setObjectName("label_6") self.label_6.setVisible(True) self.label_7 = QtWidgets.QLabel(self.tab_2) self.label_7.setGeometry(QtCore.QRect(0, 110, 341, 16)) self.label_7.setObjectName("label_7") self.label_7.setVisible(True) #label紅色字 font8 = QtGui.QFont() font8.setFamily("微軟雅黑") font8.setPointSize(10) self.label_8 = QtWidgets.QLabel(self.tab_2) self.label_8.setGeometry(QtCore.QRect(0, 80, 331, 20)) self.label_8.setObjectName("label_8") self.label_8.setFont(font8) self.label_8.setStyleSheet("color:red;") self.label_8.setVisible(False) #進度條2 self.progressBar_2 = QtWidgets.QProgressBar(self.tab_2) self.progressBar_2.setGeometry(QtCore.QRect(100, 210, 171, 26)) self.progressBar_2.setObjectName("progressBar_2") self.progressBar_2.setProperty("value", 0) self.progressBar_2.setStyleSheet("QProgressBar{border:0px solid #00A0E6;" "height:50;" "background:#191C21;" "text-align:right;" "color:white;" #"color:rgb(245,220,0);" "border-radius:2px;}" "QProgressBar::chunk{" #"border-radius:5px;" #"border:1px solid black;"rgb(167,210,102) rgb(245,220,0) "background-color:rgb(150,196,64);" "width:1px;margin:0.5px;}" ) #隱藏進度條2 self.progressBar_2.setVisible(False) self.label_2 = QtWidgets.QLabel(self.tab_2) self.label_2.setGeometry(QtCore.QRect(20, 10, 281, 51)) self.label_2.setTextFormat(QtCore.Qt.AutoText) self.label_2.setWordWrap(True) self.label_2.setObjectName("label_2") self.tabWidget.addTab(self.tab_2, "") self.tabWidget.setCurrentIndex(0) self.retranslateUi(Form) #原來是你 QtCore.QMetaObject.connectSlotsByName(Form) def jiemi(self): try: if jiemifile[0] !='' and jiemikey[0] !='': self.thread = Runthreadjiemi() self.thread.rsignal.connect(self.call_backlogjiemi) # 進程連接回傳到GUI的事件 #子進程開始前讓進度條可見 self.progressBar_2.setVisible(True) #label5顯示 self.label_5.setVisible(True) self.label_8.setVisible(True) self.thread.start() #避免重復點擊,按鈕置為不可用 self.pushButton_3.setEnabled(False) self.pushButton_4.setEnabled(False) self.pushButton.setEnabled(False) self.pushButton_2.setEnabled(False) self.pushButton_6.setEnabled(False) self.pushButton_7.setVisible(True) else: QMessageBox.information(self,"錯誤", "請先選擇好加密文件和key后再點擊解密文件!",QMessageBox.Yes) except Exception as e: pass def call_backlogjiemi(self, msg): self.progressBar_2.setValue(int(msg)) # 將線程的參數傳入進度條 #結束了順帶傳給消息框 try: if int(msg)==100: time.sleep(0.1) QMessageBox.information(self,"已完成!", "已成功解密文件到原有目錄。" + '\n' +'共耗時:'+str(usedtime4)+' '+'秒',QMessageBox.Yes) #QMessageBox.information(self,"已完成!", "已成功壓縮圖片到原有目錄",QMessageBox.Yes) #子線程結束后執行以下 #設計進度條隱藏 self.progressBar_2.setValue(0) self.progressBar_2.setVisible(False) #設置按鈕可用 self.pushButton_3.setEnabled(True) self.pushButton_4.setEnabled(True) self.pushButton.setEnabled(True) self.pushButton_2.setEnabled(True) #label5隱藏 self.label_5.setVisible(False) self.pushButton_6.setEnabled(True) jiemifile = '' jiemikey = '' self.label_6.setText("") self.label_7.setText("") self.label_8.setVisible(False) self.pushButton_7.setVisible(False) except Exception as e: print(e) def stopjiemi(self): try: reply = QMessageBox.information(self,"詢問", "確定要停止解密嗎?",QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: #QMessageBox.information(self,"已完成!", "已成功壓縮圖片到原有目錄",QMessageBox.Yes) #子線程結束后執行以下 #設計進度條隱藏 self.progressBar_2.setValue(0) self.progressBar_2.setVisible(False) #設置按鈕可用 self.pushButton_3.setEnabled(True) self.pushButton_4.setEnabled(True) self.pushButton.setEnabled(True) self.pushButton_2.setEnabled(True) #label5隱藏 self.label_5.setVisible(False) self.pushButton_6.setEnabled(True) jiemifile = '' jiemikey = '' self.label_6.setText("") self.label_7.setText("") self.label_8.setVisible(False) self.pushButton_7.setVisible(False) else: pass except Exception as e: print(e) def openfile(self): try: global jiemifile jiemifile = QFileDialog.getOpenFileName(self,"選擇文件","./","All Files (*.*)") self.label_6.setText(jiemifile[0]) except Exception as e: print(e) def opendic(self): try: global jiemikey jiemikey = QFileDialog.getOpenFileName(self,"選擇文件","./","All Files (*.key)") self.label_7.setText(jiemikey[0]) except Exception as e: print(e) def call_backlogdic(self, msg): self.progressBar_2.setValue(int(msg)) # 將線程的參數傳入進度條 #結束了順帶傳給消息框 try: if int(msg)==100: QMessageBox.information(self,"已完成!", "已成功解密文件到原有目錄。" + '\n' +'共耗時:'+str(usedtime2)+' '+'秒',QMessageBox.Yes) #QMessageBox.information(self,"已完成!", "已成功壓縮圖片到原有目錄",QMessageBox.Yes) #子線程結束后執行以下 #設計進度條隱藏 self.progressBar_2.setValue(0) self.progressBar_2.setVisible(False) #設置按鈕可用 self.pushButton_3.setEnabled(True) self.pushButton_4.setEnabled(True) self.pushButton.setEnabled(True) self.pushButton_2.setEnabled(True) #label5隱藏 self.label_5.setVisible(False) except Exception as e: print(e) def jiami(self): global filepath fileselect = QFileDialog.getOpenFileName(self,"選擇文件","./","All Files (*.*)") filepath = fileselect[0] print(filepath) if filepath!='': self.thread = Runthreadjiami() self.thread.rsignal.connect(self.call_backlogjiami) # 進程連接回傳到GUI的事件 #子進程開始前讓進度條可見 self.progressBar.setVisible(True) #label4顯示 self.label_4.setVisible(True) self.thread.start() #避免重復點擊,按鈕置為不可用 self.pushButton_3.setEnabled(False) self.pushButton_4.setEnabled(False) self.pushButton.setEnabled(False) self.pushButton_2.setEnabled(False) self.pushButton_6.setEnabled(False) def call_backlogjiami(self, msg): self.progressBar.setValue(int(msg)) # 將線程的參數傳入進度條 #結束了順帶傳給消息框 try: if int(msg)==100: QMessageBox.information(self,"已完成!", "已成功加密文件到原有目錄。" + '\n' +'共耗時:'+str(usedtime3)+' '+'秒',QMessageBox.Yes) #QMessageBox.information(self,"已完成!", "已成功壓縮圖片到原有目錄",QMessageBox.Yes) #子線程結束后執行以下 #設計進度條隱藏 self.progressBar.setValue(0) self.progressBar.setVisible(False) #設置按鈕可用 self.pushButton_3.setEnabled(True) self.pushButton_4.setEnabled(True) self.pushButton.setEnabled(True) self.pushButton_2.setEnabled(True) #label4隱藏 self.label_4.setVisible(False) #self.pushButton_4.setVisible(False) self.pushButton_6.setEnabled(True) except Exception as e: print(e) def opendicno(self): global dic dic = QFileDialog.getExistingDirectory(self,"選擇文件夾", "./") if dic!='': self.thread = Runthreaddicno() self.thread.rsignal.connect(self.call_backlogdicno) # 進程連接回傳到GUI的事件 #子進程開始前讓進度條可見 self.progressBar.setVisible(True) #label4顯示 self.label_4.setVisible(True) self.thread.start() self.pushButton_3.setEnabled(False) self.pushButton_4.setEnabled(False) self.pushButton.setEnabled(False) self.pushButton_2.setEnabled(False) self.radioButton.setEnabled(False) self.radioButton_2.setEnabled(False) self.radioButton_3.setEnabled(False) self.radioButton_4.setEnabled(False) def call_backlogdicno(self, msg): self.progressBar.setValue(int(msg)) # 將線程的參數傳入進度條 #結束了順帶傳給消息框 try: if int(msg)==100: #usedtime QMessageBox.information(self,"已完成!", "已成功加密文件到原有目錄。" + '\n' +'共耗時:'+str(usedtime)+' '+'秒',QMessageBox.Yes) #子線程結束后執行以下 #設計進度條隱藏 self.progressBar.setValue(0) self.progressBar.setVisible(False) #設置按鈕可用 self.pushButton_3.setEnabled(True) self.pushButton_4.setEnabled(True) self.pushButton.setEnabled(True) self.pushButton_2.setEnabled(True) self.radioButton.setEnabled(True) self.radioButton_2.setEnabled(True) self.radioButton_3.setEnabled(True) self.radioButton_4.setEnabled(True) #label4隱藏 self.label_4.setVisible(False) except Exception as e: print(e) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "文件加密解密")) #self.pushButton_5.setText(_translate("Form", "播放歌曲")) self.pushButton_4.setText(_translate("Form", "選擇文件夾")) self.pushButton_3.setText(_translate("Form", "選擇文件")) self.label.setText(_translate("Form", "注:本程序采用AES+RSA等算法加密。請保存好加密所生成的key文件,丟失后文件不可恢復!本程序僅供學習使用,若造成任何文件損壞或遺失,本人概不負責。可直接拖拽至按鈕加密文件。")) self.label_2.setText(_translate("Form", "注:請先選擇文件和對應的key來解密文件。")) self.label_4.setText(_translate("Form", "正在加密,請勿關閉程序:")) self.label_5.setText(_translate("Form", "正在解密,請勿關閉程序")) self.label_6.setText(_translate("Form", "")) self.label_7.setText(_translate("Form", "")) self.label_8.setText(_translate("Form", "如果進度始終未動,請確保選擇了正確的加密文件和key。")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "加密文件")) self.pushButton.setText(_translate("Form", "選擇文件")) self.pushButton_2.setText(_translate("Form", "選擇key")) self.pushButton_6.setText(_translate("Form", "解密文件")) self.pushButton_7.setText(_translate("Form", "點擊停止解密")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "解密文件")) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QMainWindow() ui = Ui_Form() ui.setupUi(ui) Form.show() sys.exit(app.exec_())