当前位置: 首页 > article >正文

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>

相关文章:

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.…...

Flutter_学习记录_状态管理之GetX

1. 状态管理、Flutter Getx介绍 1.1 状态管理 通俗的讲&#xff1a;当我们想在多个页面&#xff08;组件/Widget&#xff09;之间共享状态&#xff08;数据&#xff09;&#xff0c;或者一个页面&#xff08;组件/Widget&#xff09;中的多个子组件之间共享状态&#xff08;数…...

【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)

在图片中&#xff0c;数据流&#xff08;Data Workflow&#xff09;描述了应用程序中数据的流动过程&#xff0c;涉及 Routes&#xff08;路由&#xff09;、Controllers&#xff08;控制器&#xff09;、Models&#xff08;模型&#xff09; 和 Middleware&#xff08;中间件&…...

c++ 中的可变参数模板与折叠表达式

c 11 引入了可变参数模板&#xff0c;c 17 引入了折叠表达式&#xff0c;比 c 语言的可变参数更加简洁灵活。这篇博客总结了一些例子。 …&#xff08;省略号&#xff09;用于可变参数&#xff08;Variadic Arguments&#xff09;&#xff0c;它可以放在模板参数 或 函数参数的…...

Vala教程-第一个程序(Hello world)

代码 class Demo.HelloWorld : GLib.Object {public static int main(string[] args) {stdout.printf("Hello, World\n");return 0;} } 解析 这是一个 Vala Hello World 程序。我将一步一步地介绍它。 class Demo.HelloWorld : GLib.Object { 这一行定义了一个He…...

Git下载安装(保姆教程)

目录 1、Git下载 2、Git安装&#xff08;windows版&#xff09; &#xff08;1&#xff09;启动安装程序 &#xff08;2&#xff09;阅读许可协议 &#xff08;3&#xff09;选择安装路径 &#xff08;4&#xff09;选择组件 &#xff08;5&#xff09;选择开始菜单文件夹…...

Blender-MCP服务源码2-依赖分析

Blender-MCP服务源码2-依赖分析 有个大佬做了一个Blender-MCP源码&#xff0c;第一次提交代码是【2025年3月7号】今天是【2025年月15日】也就是刚过去一周的时间&#xff0c;所以想从0开始学习这个代码&#xff0c;了解一下大佬们的开发思路 1-核心知识点 from mcp.server.fas…...

LabVIEW压比调节器动态试验台

本案介绍了一种基于LabVIEW的压比调节器动态试验台的设计&#xff0c;通过实用的LabVIEW图形化编程语言&#xff0c;优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性&#xff0c;以及如何通过系统化的方法实现精确的动态测试和结果分析。 ​ 项目…...

基于“动手学强化学习”的知识点(二):第 15 章 模仿学习(gym版本 >= 0.26)

第 15 章 模仿学习&#xff08;gym版本 &#xff1e; 0.26&#xff09; 摘要 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析&#xff01;具体内容请阅读动手学强化学习&#xff01; 对应动手学强化学习——模仿学习 # -*- coding: utf-8 -*-import gy…...

2025-03-17 Unity 网络基础1——网络基本概念

文章目录 1 网络1.1 局域网1.2 以太网1.3 城域网1.4 广域网1.5 互联网&#xff08;因特网&#xff09;1.6 万维网1.7 小结 2 IP 地址2.1 IP 地址2.2 端口号2.3 Mac 地址2.4 小结 3 客户端与服务端3.1 客户端3.2 服务端3.3 网络游戏中的客户端与服务端 1 网络 ​ 在没有网络之前…...

springboot441-基于SpringBoot的校园自助交易系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…...

浅谈数据分析及数据思维

目录 一、数据分析及数据分析思维&#xff1f;1.1 数据分析的本质1.2 数据分析思维的本质1.2.1 拥有数据思维的具体表现1.2.2 如何培养自己的数据思维1.2.2.1 书籍1.2.2.2 借助工具1.2.2.3 刻意练习 二、数据分析的价值及必备能力&#xff1f;2.1 数据分析的价值2.1.1 现状分析…...

Hexo主题配置and常用指令

Hexo 主题配置步骤 安装Hexo&#xff1a; 安装Node.js和Git。使用npm安装Hexo CLI&#xff1a;npm install -g hexo-cli。 创建新的Hexo项目&#xff1a; 执行命令&#xff1a;hexo init <folder>&#xff0c;其中<folder>是你的项目目录名。进入项目文件夹&#…...

自定义uniapp组件,以picker组件为例

编写目的 本文说明基于vue3定义uniapp组件的关键点&#xff1a; 1、一般定义在components文件夹创建组件&#xff0c;组件与页面已经没有明确的语法格式区别&#xff0c;所以可以与页面的语法保持一致 &#xff1b; 2、组件定义后使用该组件的页面不需要引用组件即可使用&am…...

测试工程师指南:基于需求文档构建本地安全知识库的完整实战

需求文档是测试工程师日常工作的核心工具&#xff0c;如何快速检索需求文档中的关键信息&#xff08;文本、表格、图片等&#xff09;&#xff0c;并将其转化为可供 AI 查询的知识库&#xff0c;是提升工作效率的重要手段。本文将通过对 需求文档&#xff08;docx 格式&#xf…...

IP关联的定义和避免方法

大家好&#xff01;今天我们来聊一聊一个在运营多个网络账号时会遇到的重要问题——IP关联。对于那些正在运营多个账号或者进行多窗口任务的朋友们&#xff0c;这无疑是一个你必须关注的问题。IP关联&#xff0c;简单来说&#xff0c;就是多个账号在使用相同IP地址的情况下进行…...

浅述WinForm 和 WPF 的前景

在.NET 开发领域&#xff0c;WinForm 和 WPF 都是用于创建桌面应用程序的技术框架&#xff0c;但它们在很多方面存在差异&#xff0c;对于开发者来说&#xff0c;也常常会思考哪个更有前途。 一、WinForm 1. 成熟/稳定度&#xff1a; WinForms 是较早的桌面应用程序框架&am…...

CSS3学习教程,从入门到精通,CSS3 属性语法知识点及案例代码(4)

CSS3 属性语法知识点及案例代码 一、CSS3 文本属性 1. 颜色相关属性 color&#xff1a;设置文本颜色。text-shadow&#xff1a;设置文本阴影。 2. 字体相关属性 font-family&#xff1a;设置字体系列。font-size&#xff1a;设置字体大小。font-weight&#xff1a;设置字体…...

MyBatis SqlSession 是如何创建的? 它与 SqlSessionFactory 有什么关系?

SqlSession 是 MyBatis 中与数据库交互的核心接口&#xff0c;它提供了执行 SQL 语句、管理事务、获取 Mapper 接口代理对象等关键功能。 SqlSession 实例 不是直接通过 new 关键字创建的&#xff0c;而是通过 SqlSessionFactory 工厂来创建的。 SqlSessionFactory 负责创建 Sq…...

【操作系统安全】任务4:Windows 系统网络安全实践里常用 DOS 命令

目录 一、引言 二、网络信息收集类命令 2.1 ipconfig 命令 2.1.1 功能概述 2.1.2 实例与代码 2.2 ping 命令 2.2.1 功能概述 2.2.2 实例与代码 2.3 tracert 命令 2.3.1 功能概述 2.3.2 实例与代码 三、网络连接与端口管理类命令 3.1 netstat 命令 3.1.1 功能概述…...

Vue 概念、历史、发展和Vue简介

一、Vue概念 官方定义&#xff1a; 渐进式JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架。 Vue.js 是一个流行的前端JavaScript框架&#xff0c;由尤雨溪&#xff08;Evan You&#xff09;开发并维护。 它最初于2014年发…...

【从零开始学习计算机科学】信息安全(二)物理安全

【从零开始学习计算机科学】信息安全(二)物理安全 物理安全物理安全的涵义物理安全威胁常见物理安全问题物理安全需求规划物理安全需求设备安全防盗和防毁机房门禁系统机房入侵检测和报警系统防电磁泄漏防窃听设备管理设备维护设备的处置和重复利用设备的转移电源安全电源调整…...

LeetCode hot 100—验证二叉搜索树

题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 示例 1&#…...

【商城实战(39)】Spring Boot 携手微服务,商城架构焕新篇

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

MongoDB 可观测性最佳实践

MongoDB 介绍 MongoDB 是一个高性能、开源的 NoSQL 数据库&#xff0c;它采用灵活的文档数据模型&#xff0c;非常适合处理大规模的分布式数据。MongoDB 的文档存储方式使得数据结构可以随需求变化而变化&#xff0c;提供了极高的灵活性。它支持丰富的查询语言&#xff0c;允许…...

论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

LoRA 论文 传统全面微调&#xff0c;对每个任务学习的参数与原始模型相同&#xff1a; m a x Φ ∑ ( x , y ) ∈ Z ∑ t 1 ∣ y ∣ l o g ( P Φ ( y t ∣ x , y < t ) ) 式(1) max_{\Phi}\sum_{(x,y)\in Z}\sum^{|y|}_{t1}log(P_{\Phi}(y_t|x,y<t)) \qquad \text{式(…...

UE5中 Character、PlayerController、PlayerState、GameMode和GameState核心类之间的联动和分工·

1. GameMode 与 GameState 关系描述 GameMode&#xff1a;定义游戏规则和逻辑&#xff0c;控制游戏的开始、进行和结束。GameState&#xff1a;存储和同步全局游戏状态&#xff0c;如得分、时间、胜利条件等。 联动方式 GameMode初始化GameState&#xff1a;GameMode在游戏…...

Redis的IO多路复用机制:高效的网络通信设计

在高并发、高性能的应用中&#xff0c;如何有效地管理和处理大量的客户端请求是一个至关重要的问题。Redis作为一个高性能的内存数据存储系统&#xff0c;面对大量并发客户端请求时&#xff0c;需要具备良好的网络通信能力。在Redis的设计中&#xff0c;IO多路复用机制是其核心…...

Ubuntu24.04 启动后突然进入tty,无法进入图形界面

问题描述 昨晚在编译 Android AOSP 14 后&#xff0c;进入了登录页面&#xff0c;但出现了无法输入密码的情况&#xff0c;且无法正常关机&#xff0c;只能强制重启。重启后&#xff0c;系统只能进入 TTY 页面&#xff0c;无法进入图形界面。 问题排查 经过初步排查&#x…...

搭建主从服务器

任务需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#xff0c;并且都开启防…...