Python使用wxPython打造文件批量压缩工具
作者:winfredzhang
前言
在日常工作中,我们经常需要将多个文件打包压缩,传统的方法是在文件管理器中手动选择文件,右键压缩。但当文件分散在不同位置,或者需要按特定顺序压缩时,这个过程就变得繁琐起来。今天,我将分享如何使用 Python 的 wxPython 库,创建一个功能强大的图形化文件批量压缩工具。
项目需求分析
在开始编码之前,让我们明确一下这个工具需要实现的功能:
- 支持多种方式添加文件(手动输入路径、文件选择对话框、文件夹批量添加)
- 使用列表展示所有待压缩文件
- 支持勾选机制,灵活选择要压缩的文件
- 按列表顺序进行压缩
- 压缩完成后自动打开目标文件夹
- 跨平台兼容(Windows、macOS、Linux)
技术选型
wxPython 是 Python 的跨平台 GUI 工具包,它具有以下优势:
- 原生界面外观,在不同操作系统上都有良好的用户体验
- 丰富的控件库,满足各种界面需求
- 文档完善,社区活跃
- 性能优秀,适合桌面应用开发
运行效果

核心实现
1. 界面布局设计
我们的界面采用垂直布局,自上而下分为四个主要区域:
main_sizer = wx.BoxSizer(wx.VERTICAL)
- 标题区域:显示应用程序名称
- 文件添加区域:提供多种添加文件的方式
- 文件列表区域:显示所有文件并支持勾选
- 操作按钮区域:执行压缩等操作
使用 StaticBoxSizer 可以为不同区域添加边框和标题,让界面层次分明:
input_box = wx.StaticBox(panel, label='添加文件') input_sizer = wx.StaticBoxSizer(input_box, wx.VERTICAL)
2. 多种文件添加方式
方式一:手动输入路径
使用多行 TextCtrl 组件,支持用户粘贴完整文件路径:
self.path_text = wx.TextCtrl(panel, style=wx.TE_MULTILINE, size=(-1, 80))
添加路径时进行验证,确保文件存在:
def on_add_path(self, event):
path_text = self.path_text.GetValue().strip()
paths = [p.strip() for p in path_text.split('\n') if p.strip()]
for path in paths:
if os.path.exists(path) and os.path.isfile(path):
if path not in self.file_list:
self.file_list.append(path)
self.file_checklist.Append(path)
self.file_checklist.Check(self.file_checklist.GetCount() - 1)
方式二:文件选择对话框
使用 wx.FileDialog 提供系统原生的文件选择界面:
with wx.FileDialog(self, "选择文件",
wildcard="所有文件 (*.*)|*.*",
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) as fileDialog:
if fileDialog.ShowModal() == wx.ID_CANCEL:
return
paths = fileDialog.GetPaths()
注意 wx.FD_MULTIPLE 标志允许用户一次选择多个文件。
方式三:文件夹批量添加
使用 wx.DirDialog 选择文件夹,然后遍历其中的所有文件:
def on_select_folder(self, event):
with wx.DirDialog(self, "选择文件夹") as dirDialog:
if dirDialog.ShowModal() == wx.ID_CANCEL:
return
folder_path = dirDialog.GetPath()
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
# 添加到列表
3. 可勾选的文件列表
wx.CheckListBox 是实现勾选功能的关键组件,它结合了列表框和复选框的特性:
self.file_checklist = wx.CheckListBox(panel, size=(-1, 250))
提供便捷的列表管理功能:
# 全选
def on_check_all(self, event):
for i in range(self.file_checklist.GetCount()):
self.file_checklist.Check(i, True)
# 取消全选
def on_uncheck_all(self, event):
for i in range(self.file_checklist.GetCount()):
self.file_checklist.Check(i, False)
4. 文件压缩实现
使用 Python 标准库的 zipfile 模块进行压缩:
def on_zip_files(self, event):
# 获取勾选的文件
checked_files = []
for i in range(self.file_checklist.GetCount()):
if self.file_checklist.IsChecked(i):
checked_files.append(self.file_list[i])
# 创建压缩文件
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for file_path in checked_files:
if os.path.exists(file_path):
arcname = os.path.basename(file_path)
zipf.write(file_path, arcname)
使用 ZIP_DEFLATED 参数启用压缩,可以有效减小文件大小。
5. 自动打开目标文件夹
这是一个提升用户体验的小细节,不同操作系统需要使用不同的方法:
def open_folder(self, folder_path):
system = platform.system()
if system == 'Windows':
os.startfile(folder_path)
elif system == 'Darwin': # macOS
subprocess.Popen(['open', folder_path])
else: # Linux
subprocess.Popen(['xdg-open', folder_path])
技术亮点
1. 数据一致性维护
程序维护两个数据结构:self.file_list(Python 列表)和 self.file_checklist(wxPython 控件)。在添加、删除文件时,必须同步更新这两个结构,确保数据一致性。
2. 重复文件检查
在添加文件前检查是否已存在,避免重复:
if path not in self.file_list:
self.file_list.append(path)
3. 智能文件名生成
使用时间戳生成默认压缩文件名,避免文件覆盖:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
default_name = f"archive_{timestamp}.zip"
4. 异常处理
在关键操作处添加 try-except 块,提升程序健壮性:
try:
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
# 压缩操作
except Exception as e:
wx.MessageBox(f'压缩文件时出错:{str(e)}', '错误', wx.OK | wx.ICON_ERROR)
使用示例
安装依赖
pip install wxpython
运行程序
python file_zipper.py
操作流程
- 启动程序后,可以看到清晰的界面布局
- 通过三种方式之一添加文件到列表
- 在列表中勾选需要压缩的文件(默认全部勾选)
- 点击"压缩勾选的文件"按钮
- 选择压缩文件的保存位置
- 等待压缩完成,程序会自动打开目标文件夹
可能的扩展功能
这个基础版本已经能满足日常需求,但还有许多可以改进的地方:
- 压缩级别选择:让用户选择压缩比例(速度 vs 大小)
- 进度条显示:压缩大文件时显示进度
- 拖放支持:直接拖拽文件到窗口
- 文件预览:显示文件大小、类型等信息
- 批量操作:支持向上/向下移动文件顺序
- 配置保存:记住用户的常用设置
- 密码保护:为压缩文件添加密码
- 多格式支持:支持 tar、7z 等其他压缩格式
到此这篇关于Python使用wxPython打造文件批量压缩工具的文章就介绍到这了,更多相关Python文件批量压缩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
