在本篇博客中,我们将使用 wxPython 模块创建一个简单的文件压缩工具。该工具具有图形用户界面(GUI),可以选择源文件夹中的文件,将其压缩为 ZIP 文件,并将压缩文件保存到目标文件夹中。
C:\pythoncode\new\zipmultifile.py
准备工作
在开始之前,请确保已经安装了 wxPython 模块。你可以使用以下命令来安装:
pip install wxPython
创建 GUI 界面
首先,我们导入所需的模块,并创建一个 MyFrame
类来表示我们的应用程序窗口。
import wx
import wx.lib.agw.multidirdialog as MDD
import os
import datetime
import zipfile
class MyFrame(wx.Frame):
# ...
在 MyFrame
类的构造函数中,我们创建了窗口上的各个控件,包括选择源文件夹的按钮、显示文件列表的 Listbox、选择目标文件夹的按钮以及 Zip 按钮。我们还定义了两个实例变量 source_folder
和 target_folder
分别用于存储选择的源文件夹和目标文件夹的路径。
实现事件处理函数
我们为选择源文件夹按钮绑定了 on_select_source_folder
方法,该方法会打开文件夹选择对话框,并在选择完成后加载文件列表到 Listbox 中。
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
方法,该方法会打开文件夹选择对话框,并在选择完成后存储目标文件夹的路径。
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 文件,将选择的文件添加到压缩文件中,并保存到目标文件夹中。
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 应用程序实例,并显示窗口。
app = wx.App()
frame = MyFrame(None, title="ZIP 文件压缩")
frame.Show()
app.MainLoop()
全部代码
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 格式。你可以按照自己的需求对代码进行修改和扩展,以满足更多复杂的压缩需求。
希望本篇博客内容对你有所帮助。如果你有任何问题或需要进一步的指导,请随时提问。祝你编程愉快!