python-GUI-pyqt5之文件加密解密工具


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_())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM