使用 zipfile创建文件压缩工具

news/2024/7/6 3:04:30 标签: python, wxpython, zip, 选择文件夹

在本篇博客中,我们将使用 wxPython 模块创建一个简单的文件压缩工具。该工具具有图形用户界面(GUI),可以选择源文件夹中的文件,将其压缩为 ZIP 文件,并将压缩文件保存到目标文件夹中。
C:\pythoncode\new\zipmultifile.py
在这里插入图片描述

准备工作

在开始之前,请确保已经安装了 wxPython 模块。你可以使用以下命令来安装:

pip install wxPython

创建 GUI 界面

首先,我们导入所需的模块,并创建一个 MyFrame 类来表示我们的应用程序窗口。

python">import wx
import wx.lib.agw.multidirdialog as MDD
import os
import datetime
import zipfile

class MyFrame(wx.Frame):
    # ...

MyFrame 类的构造函数中,我们创建了窗口上的各个控件,包括选择源文件夹的按钮、显示文件列表的 Listbox、选择目标文件夹的按钮以及 Zip 按钮。我们还定义了两个实例变量 source_foldertarget_folder 分别用于存储选择的源文件夹和目标文件夹的路径。

实现事件处理函数

我们为选择源文件夹按钮绑定了 on_select_source_folder 方法,该方法会打开文件夹选择对话框,并在选择完成后加载文件列表到 Listbox 中。

python">def on_select_source_folder(self, event):
    dlg = MDD.MultiDirDialog(self, title="选择源文件夹")
    if dlg.ShowModal() == wx.ID_OK:
        self.source_folder = dlg.GetPaths()[0]
        self.load_files()
    dlg.Destroy()

类似地,我们为选择目标文件夹按钮绑定了 on_select_target_folder 方法,该方法会打开文件夹选择对话框,并在选择完成后存储目标文件夹的路径。

python">def on_select_target_folder(self, event):
    dlg = MDD.MultiDirDialog(self, title="选择目标文件夹")
    if dlg.ShowModal() == wx.ID_OK:
        self.target_folder = dlg.GetPaths()[0]
    dlg.Destroy()

最后,我们为 Zip 按钮绑定了 on_zip 方法,该方法会检查是否选择了要压缩的文件,如果是,则创建一个 ZIP 文件,将选择的文件添加到压缩文件中,并保存到目标文件夹中。

python">def on_zip(self, event):
    selected_files = [self.listbox.GetString(i) for i in self.listbox.GetSelections()]
    if len(selected_files) == 0:
        wx.MessageBox("请先选择要压缩的文件!", "错误", wx.OK | wx.ICON_ERROR)
        return

    now = datetime.datetime.now()
    zip_filename = os.path.join(self.target_folder, now.strftime("%Y%m%d") + ".zip")

    with zipfile.ZipFile(zip_filename, 'w') as zipf:
        for file in selected_files:
            file_path = os.path.join(self.source_folder, file)
            zipf.write(file_path, file)

    wx.MessageBox("文件已成功压缩为 ZIP 文件!", "成功", wx.OK | wx.ICON_INFORMATION)

启动应用程序

最后,我们创建一个 wxPython 应用程序实例,并显示窗口。

python">app = wx.App()
frame = MyFrame(None, title="ZIP 文件压缩")
frame.Show()
app.MainLoop()

全部代码

python">import wx
import wx.lib.agw.multidirdialog as MDD
import os
import datetime
import zipfile

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title, size=(600, 400))
        
        self.panel = wx.Panel(self)
        
        self.source_folder_btn = wx.Button(self.panel, label="选择源文件夹", pos=(10, 10))
        self.source_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_source_folder)
        
        self.listbox = wx.ListBox(self.panel, pos=(10, 50), size=(200, 300), style=wx.LB_MULTIPLE)
        
        self.target_folder_btn = wx.Button(self.panel, label="选择目标文件夹", pos=(250, 10))
        self.target_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_target_folder)
        
        self.zip_btn = wx.Button(self.panel, label="Zip", pos=(500, 10))
        self.zip_btn.Bind(wx.EVT_BUTTON, self.on_zip)
        
        self.source_folder = ""
        self.target_folder = ""
        
    def on_select_source_folder(self, event):
        dlg = MDD.MultiDirDialog(self, title="选择源文件夹")
        if dlg.ShowModal() == wx.ID_OK:
            self.source_folder = dlg.GetPaths()[0]
            self.load_files()
        dlg.Destroy()
        
    def load_files(self):
        self.listbox.Clear()
        files = os.listdir(self.source_folder)
        for file in files:
            self.listbox.Append(file)
        
    def on_select_target_folder(self, event):
        dlg = MDD.MultiDirDialog(self, title="选择目标文件夹")
        if dlg.ShowModal() == wx.ID_OK:
            self.target_folder = dlg.GetPaths()[0]
        dlg.Destroy()
        
    def on_zip(self, event):
        selected_files = [self.listbox.GetString(i) for i in self.listbox.GetSelections()]
        if len(selected_files) == 0:
            wx.MessageBox("请先选择要压缩的文件!", "错误", wx.OK | wx.ICON_ERROR)
            return
        
        now = datetime.datetime.now()
        zip_filename = os.path.join(self.target_folder, now.strftime("%Y%m%d") + ".zip")
        
        with zipfile.ZipFile(zip_filename, 'w') as zipf:
            for file in selected_files:
                file_path = os.path.join(self.source_folder, file)
                zipf.write(file_path, file)
        
        wx.MessageBox("文件已成功压缩为 ZIP 文件!", "成功", wx.OK | wx.ICON_INFORMATION)
        

app = wx.App()
frame = MyFrame(None, title="ZIP 文件压缩")
frame.Show()
app.MainLoop()

总结

通过使用 wxPython 模块,我们创建了一个简单而实用的文件压缩工具。该工具具有直观的图形用户界面,可以方便地选择源文件夹和目标文件夹,并将选择的文件压缩为 ZIP 格式。你可以按照自己的需求对代码进行修改和扩展,以满足更多复杂的压缩需求。

希望本篇博客内容对你有所帮助。如果你有任何问题或需要进一步的指导,请随时提问。祝你编程愉快!


http://www.niftyadmin.cn/n/4988347.html

相关文章

C语言控制语句——跳转关键字

循环和switch专属的跳转:break循环专属的跳转:continue无条件跳转:goto break 循环的break说明 某一条件满足时,不再执行循环体中后续重复的代码,并退出循环 需求:一共吃5碗饭, 吃到第3碗吃饱了, 结束吃饭…

linux centos7 系统之编程:求水仙花数

在Python编程中,有列表、元组和字典三类变量可以使用,方便数据的存储与处理,而bash中仅有字符串变量、数组、函数可用,方法运用上受到限制,这与bash基于C语言,注重语法结构的严谨有关。而Python等高级语言更…

开发一个npm包

1 注册一个npm账号 npm https://www.npmjs.com/ 2 初始化一个npm 项目 npm init -y3编写一段代码 function fn(){return 1+2 }exports.hello=fn; </

医疗小程序:让服务更高效,用户体验更优化

随着移动互联网的快速发展&#xff0c;小程序已经成为了一个热门的开发方向。医疗健康类小程序也不例外&#xff0c;拥有广泛的市场需求和前景。本文将为你提供一份完整的医疗健康类小程序开发攻略&#xff0c;帮助你快速开发上线一个专业成熟的小程序商城。 一、选择合适的小程…

有时间窗车辆路径问题(vehicle routing problems with time windows,VRPTW)学习实践与base案例代码开发

有时间窗车辆路径问题&#xff08;Vehicle Routing Problems with Time Windows&#xff0c;VRPTW&#xff09;是一类著名的组合优化问题&#xff0c;涉及在有限时间窗口约束下&#xff0c;有效地安排多个车辆的路径&#xff0c;以满足客户需求。 在VRPTW中&#xff0c;假设有…

js本地存储localStorage和sessionStorage

JavaScript本地存储有两种方式&#xff1a;localStorage和sessionStorage。 localStorage是一种持久化存储方式&#xff0c;数据会一直保存在用户的本地计算机上&#xff0c;直到用户手动清除或者浏览器卸载。localStorage可以存储较大的数据量&#xff0c;可以跨越不同的浏览器…

react轮播图

这里 我用的是组件&#xff1a; 网址&#xff1a;Collapse 折叠面板 - Ant Design Mobile 1.首先 先声明一个变量 2、把需要的数据存存进去 3、组件内容复制过来&#xff08;这里用到的是map循环&#xff09; 然后图片就出来了 就是这个简单 哈哈哈哈&#xff01;&#xff01…

CSP的理解与绕过

文章目录 前言CSP简介CSP如何工作CSP指令CSP指令值 例题[AFCTF 2021]BABY_CSP 前言 刚学习完xss&#xff0c;把xsss-labs靶场都通了打算试试水&#xff0c;遇到此题[AFCTF 2021]BABY_CSP&#xff0c;借此机会学习下CSP CSP简介 Content Security Policy (CSP)内容安全策略&am…