pyqt 上傳文件或者文件夾打包壓縮文件并添加密碼并將密碼和目標文件信息保存在json文件

一、完整代碼實現

import sys
import os
import json
import pyzipper
from datetime import datetime
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLineEdit, QLabel, QFileDialog,QMessageBox, QProgressBar)
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QFont, QIconclass ZipThread(QThread):progress = pyqtSignal(int)finished = pyqtSignal(str)error = pyqtSignal(str)def __init__(self, source, password, parent=None):super().__init__(parent)self.source = sourceself.password = passwordself.zip_path = f"{os.path.splitext(source)}_encrypted.zip"def run(self):try:total_files = self.calculate_total_files()processed = 0with pyzipper.AESZipFile(self.zip_path, 'w', compression=pyzipper.ZIP_LZMA,encryption=pyzipper.WZ_AES) as zf:zf.setpassword(self.password.encode())if os.path.isdir(self.source):for root, dirs, files in os.walk(self.source):for file in files:full_path = os.path.join(root, file)arcname = os.path.relpath(full_path, start=self.source)zf.write(full_path, arcname)processed += 1self.progress.emit(int((processed/total_files)*100))else:zf.write(self.source, os.path.basename(self.source))self.progress.emit(100)self.save_metadata()self.finished.emit(self.zip_path)except Exception as e:self.error.emit(str(e))def calculate_total_files(self):if os.path.isfile(self.source):return 1count = 0for root, dirs, files in os.walk(self.source):count += len(files)return countdef save_metadata(self):metadata = {"timestamp": datetime.now().isoformat(),"source_path": self.source,"zip_path": self.zip_path,"file_size": os.path.getsize(self.zip_path),"algorithm": "AES-256"}with open(self.zip_path + ".json", 'w') as f:json.dump(metadata, f, indent=2)class SecureZipApp(QWidget):def __init__(self):super().__init__()self.selected_path = ""self.initUI()self.applyStyles()def initUI(self):self.setWindowTitle('安全文件壓縮器')self.setWindowIcon(QIcon('lock_icon.png'))self.setFixedSize(500, 400)# 界面組件self.title_label = QLabel("安全加密壓縮工具")self.path_label = QLabel("已選路徑:無")self.progress_bar = QProgressBar()self.status_label = QLabel("就緒")self.pwd_input = QLineEdit()self.pwd_input.setPlaceholderText("輸入加密密碼(至少8位)")self.pwd_input.setEchoMode(QLineEdit.Password)# 按鈕組btn_layout = QHBoxLayout()self.file_btn = QPushButton("📁 選擇文件")self.dir_btn = QPushButton("📂 選擇文件夾")self.start_btn = QPushButton("🔒 開始加密壓縮")# 布局設置main_layout = QVBoxLayout()main_layout.addWidget(self.title_label, alignment=Qt.AlignCenter)main_layout.addSpacing(20)main_layout.addWidget(self.path_label)main_layout.addWidget(self.pwd_input)main_layout.addSpacing(15)btn_layout.addWidget(self.file_btn)btn_layout.addWidget(self.dir_btn)main_layout.addLayout(btn_layout)main_layout.addSpacing(30)main_layout.addWidget(self.progress_bar)main_layout.addWidget(self.status_label)main_layout.addWidget(self.start_btn)self.setLayout(main_layout)# 信號連接self.file_btn.clicked.connect(self.select_file)self.dir_btn.clicked.connect(self.select_dir)self.start_btn.clicked.connect(self.start_compression)def applyStyles(self):self.setStyleSheet("""\QWidget {\background-color: #F5F7FA;\font-family: 'Segoe UI';\}\QLabel#title_label {\font-size: 24px;\color: #2C3E50;\font-weight: bold;\}\QPushButton {\background-color: #4CAF50;\color: white;\border: none;\padding: 10px 20px;\border-radius: 5px;\font-size: 14px;\}\QPushButton:hover {\background-color: #45a049;\}\QLineEdit {\padding: 8px;\border: 2px solid #BDC3C7;\border-radius: 4px;\font-size: 14px;\}\QProgressBar {\height: 20px;\text-align: center;\border: 2px solid #BDC3C7;\border-radius: 5px;\}\QProgressBar::chunk {\background-color: #4CAF50;\width: 10px;\}\""")self.title_label.setObjectName("title_label")self.title_label.setFont(QFont("Arial", 16, QFont.Bold))self.status_label.setStyleSheet("color: #7F8C8D; font-size: 12px;")def select_file(self):path, _ = QFileDialog.getOpenFileName(self, "選擇文件")if path:self.selected_path = pathself.path_label.setText(f"已選文件:{os.path.basename(path)}")self.status_label.setText("就緒")def select_dir(self):path = QFileDialog.getExistingDirectory(self, "選擇文件夾")if path:self.selected_path = pathself.path_label.setText(f"已選文件夾:{os.path.basename(path)}")self.status_label.setText("就緒")def start_compression(self):if not self.selected_path:QMessageBox.warning(self, "警告", "請先選擇文件或文件夾")returnif len(self.pwd_input.text()) < 8:QMessageBox.warning(self, "警告", "密碼長度至少8位")returnself.thread = ZipThread(self.selected_path, self.pwd_input.text())self.thread.progress.connect(self.update_progress)self.thread.finished.connect(self.on_success)self.thread.error.connect(self.on_error)self.thread.start()self.start_btn.setEnabled(False)self.status_label.setText("正在壓縮...")def update_progress(self, value):self.progress_bar.setValue(value)def on_success(self, zip_path):self.start_btn.setEnabled(True)self.status_label.setText("操作完成")QMessageBox.information(self, "成功", f"加密壓縮完成!\n保存路徑:{zip_path}\n元數據文件:{zip_path}.json")def on_error(self, message):self.start_btn.setEnabled(True)self.status_label.setText("操作失敗")QMessageBox.critical(self, "錯誤", f"發生錯誤:{message}")if __name__ == '__main__':app = QApplication(sys.argv)window = SecureZipApp()window.show()sys.exit(app.exec_())

二、界面美化特色

  1. 現代UI設計

    • 采用扁平化設計風格
    • 使用系統圖標符號(📁📂🔒)提升直觀性
    • 自定義QSS樣式表實現漸變按鈕和圓角邊框
  2. 交互優化

    • 實時路徑顯示
    • 動態進度條反饋
    • 狀態標簽提示當前操作階段
    • 按鈕禁用狀態防止重復操作
  3. 安全增強

    • 密碼強度驗證(至少8位)
    • 密碼輸入掩碼顯示
    • 元數據文件獨立存儲(避免密碼泄露)
  4. 響應式布局

    • 固定窗口尺寸防止變形
    • 智能間距控制
    • 組件對齊優化

三、使用說明

  1. 選擇文件/文件夾
  2. 輸入8位以上加密密碼
  3. 點擊加密壓縮按鈕
  4. 查看生成的.zip文件和同名的.json元數據文件

由小藝AI生成<xiaoyi.huawei.com>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898129.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos操作系統上傳和下載百度網盤內容

探序基因 整理 進入百度網盤官網百度網盤 客戶端下載 下載linux的rpm格式的安裝包 在linux命令行中輸入&#xff1a;rpm -ivh baidunetdisk_4.17.7_x86_64.rpm 出現報錯&#xff1a; 錯誤&#xff1a;依賴檢測失敗&#xff1a; libXScrnSaver 被 baidunetdisk-4.17.7-1.x8…

LeetCode134?加油站

關聯LeetCode題號134 本題特點 貪心局部最優解-部分差值 如果小于0&#xff08;消耗大于油站油量&#xff09; 就從下一個加油站開始&#xff0c;因為如果中間有小于0的情況 當前站就不可能是始發站&#xff0c;整體最優解-整體差值 如果小于0 &#xff0c;那么就是不能有始發…

基于 Verilog 的時序設計:從理論到實踐的深度探索

在數字電路設計領域,時序設計是一個至關重要的環節,它涉及到組合邏輯電路與時序邏輯電路的設計差異、時鐘信號的運用以及觸發器的工作原理等多個方面。本文將圍繞基于 Verilog 的時序設計實驗展開,詳細闡述實驗過程、代碼實現以及結果分析,幫助讀者深入理解時序設計的核心概…

藍牙系統的核心組成解析

一、硬件層&#xff1a;看得見的物理載體 1. 射頻模塊&#xff08;Radio Frequency Module&#xff09; 專業描述&#xff1a;工作在2.4GHz ISM頻段&#xff0c;支持GFSK/π/4 DQPSK/8DPSK調制方式 功能類比&#xff1a;相當于人的"嘴巴"和"耳朵" 發射端…

獵豹移動(Cheetah Mobile)

本文來自騰訊元寶 公司背景與發展歷程 ?成立與早期定位 獵豹移動成立于2010年11月&#xff0c;由金山安全與可牛影像合并而成&#xff0c;初期以移動安全工具和清理軟件為核心業務。其明星產品包括《獵豹清理大師》&#xff08;Clean Master&#xff09;和《獵豹瀏覽器》&…

go的gmp

參考鏈接&#xff1a;https://www.bilibili.com/video/BV19r4y1w7Nx Golang的GMP調度模型(協程調度器)是其并發編程的核心。GMP代表Goroutine、Machine和Processor三個關鍵組成部分。Goroutine是Go語言中的輕量級線程&#xff0c;Machine是操作系統的線程&#xff0c;Processor…

Vue3-高級特性

一、Vue中自定義指令 1.認識自定義指令 在Vue的模板語法中我們學習過各種各樣的指令&#xff1a;v-show、v-for、v-model等等&#xff0c;除了使用這些指令之外&#xff0c;Vue也允許我們來 自定義自己的指令。 注意&#xff1a;在Vue中&#xff0c;代碼的復用和抽象主要還是…

【量化策略】動量突破策略

【量化策略】動量突破策略 &#x1f680;量化軟件開通 &#x1f680;量化實戰教程 技術背景與應用場景 動量突破策略是一種基于市場趨勢的量化交易策略&#xff0c;它通過識別資產價格的動量變化來預測未來的價格走勢。這種策略適用于那些價格波動較大、趨勢明顯的市場環境…

基于CPLD電力/軌道交通3U機箱開關量輸出板(DO)

板卡簡介&#xff1a; 本板為開關量輸出板&#xff08;DO&#xff09;&#xff0c;采用固態繼電器用于電平輸出或負載驅動&#xff0c;典型輸出高電平為DC110V&#xff0c;低電平為0V。 性能規格&#xff1a; 電源&#xff1a;DC5V&#xff0c;DC3.3V&#xff0c;DC15V&#…

【C++經典例題】反轉字符串中單詞的字符順序:兩種實現方法詳解

&#x1f493; 博客主頁&#xff1a;倔強的石頭的CSDN主頁 &#x1f4dd;Gitee主頁&#xff1a;倔強的石頭的gitee主頁 ? 文章專欄&#xff1a;C經典例題 期待您的關注 目錄 問題描述 基于快慢指針的解法 基于索引的解法 兩種方法的比較 問題描述 在處理字符串相關的問題…

Java基礎語法練習45(網絡編程)

目錄 一、網絡的相關概念 1.網絡通信 2.網絡 3.ip 地址 4.ipv4 地址分類 5.域名 6.網絡通信協議 7.TCP 和 UDP 二、InetAddress類 1.相關方法 2.代碼示例如下&#xff1a; 三、Socket 1.基本介紹 四、TCP 網絡通信編程 1.基本介紹 2.應用示例&#xff1a; 2.1…

【Json—RPC框架】:宏定義不受命名空間限制,續行符的錯誤使用造成的bug

為什么不受命名空間的限制&#xff1f; 宏處理在預處理階段&#xff0c; 預處理在編譯之前&#xff0c;編譯才進行語法分析&#xff0c;語義分析。命名空間也只能限制這部分。 在Json-RPC框架的實現中&#xff0c;遇到如下問題。一開始以為是在實現日志宏的時候&#xff0c;有…

四川省包含哪些水系

背景&#xff1a; 想知道四川省包含哪些水系&#xff0c;以及各個水系的分布&#xff0c;起點、流經省市、終點等 {label: "嘉陵江",value: "嘉陵江",},{label: "渠江",value: "渠江",},{label: "涪江",value: "涪江&q…

子序列問題寫法

子序列問題可以按照動態規劃的思想去寫。 子序列問題類型 子序列 是由數組派生而來的序列&#xff0c;刪除&#xff08;或不刪除&#xff09;數組中的元素而不改變其余元素的順序。 例如&#xff0c;[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。 寫法思路 創建兩層for循環…

C++ primer plus 使用類下

目錄 前言 一 轉換函數 總結 前言 接著上一章的內容 一 轉換函數 接著我們上一章節的內容&#xff0c;我們知道我們類里面有一個自動轉換利用這個運算符&#xff0c;這樣就可以使得對象可以接受這個值 那么有沒有可以使一個普通類型去接收一個對象呢&#xff1f; 答案是…

聲網自研算法如何重定義AI交互容災標準

在咖啡廳里&#xff0c;當我把手機置于咖啡機與微波爐形成的電磁干擾區時&#xff0c;WiFi丟包率飆升至83%&#xff0c;但AI的回應延遲僅從1.2秒增至1.4秒。這背后是聲網自研的Phoenix抗弱網算法在發揮作用&#xff0c;通過AI驅動的動態FEC&#xff08;前向糾錯&#xff09;機制…

詳解布隆過濾器及其模擬實現

目錄 布隆過濾器 引入 概念 工作原理 模擬實現布隆過濾器 哈希函數集 布隆過濾器基本框架 add函數&#xff08;添加到布隆過濾器中&#xff09; contains函數&#xff08;判斷是否存在該值&#xff09; 完整代碼 布隆過濾器的刪除 布隆過濾器的誤判率 布隆過濾器的…

巧用 VSCode 與 AI 編碼提升 Vue 前端開發效率

在當今快節奏的軟件開發領域&#xff0c;提升開發效率是每個開發者都追求的目標。對于 Vue 前端開發而言&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已經成為了眾多開發者的首選編輯器。而隨著人工智能技術的發展&#xff0c;各類 AI 編碼擴展工具如雨后春筍…

5分鐘快速申請一個EDU教育郵箱

感謝CSDN作者 CodeDevMaster 于 2023-10-16 13:22:40 發布作品《5分鐘快速申請一個EDU教育郵箱》 本文內容為作者方法的實踐與復刻&#xff0c;同時 現在是2025/03/17&#xff0c;執行的細節有部分變動&#xff0c;所以完整展示一波。 祝各位好運&#xff0c;同時本案例中展示…

Go string 字符串底層邏輯

在 Go 語言中&#xff0c;string 類型的底層結構是一個結構體&#xff0c;包含兩個字段&#xff1a;一個指向字節數組的指針和該字節數組的長度。以下是其在 Go 源碼中的大致定義&#xff1a;type stringStruct struct {str unsafe.Pointerlen int } str&#xff1a;這是一個指…