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.mzph.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;这是一个指…