在 wxPython
中实现文件复制工具:如何通过 GUI 选择源文件夹与目标文件夹
wxPython
是一个功能强大的 GUI 框架,它允许开发者通过 Python 轻松构建跨平台的桌面应用。在这篇博客中,我将展示如何利用 wxPython
创建一个文件复制工具,使得用户能够选择源文件夹和目标文件夹,并将源文件夹中的文件复制到目标文件夹下一个以当前日期命名的子文件夹中。
D:\spiderdocs\copyupanfiletofolder.py
目标功能
- 选择源文件夹:用户能够选择一个源文件夹,程序将从中获取文件。
- 选择目标文件夹:用户能够选择目标文件夹,程序将在该文件夹中创建一个以当前日期命名的子文件夹。
- 文件复制:将源文件夹中的所有文件复制到目标文件夹中的子文件夹。
前提准备
在开始之前,请确保已经安装了 wxPython
和 shutil
模块。
你可以通过以下命令安装 wxPython
:
pip install wxPython
shutil
是 Python 的标准库之一,用于处理文件和目录,因此无需单独安装。
实现步骤
1. 创建主窗口
首先,我们需要创建一个简单的 GUI 窗口,在其中添加按钮和文本框,允许用户选择源文件夹和目标文件夹。
import wx
import os
import shutil
from datetime import datetime
# 创建主窗口类
class FileCopyApp(wx.Frame):
def __init__(self, *args, **kw):
super(FileCopyApp, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
# 设置窗口
self.SetTitle('文件复制工具')
self.SetSize(400, 250)
panel = wx.Panel(self)
# 创建控件
vbox = wx.BoxSizer(wx.VERTICAL)
# 源文件夹选择按钮
self.src_folder_button = wx.Button(panel, label="选择源文件夹")
self.src_folder_button.Bind(wx.EVT_BUTTON, self.onSelectSourceFolder)
vbox.Add(self.src_folder_button, flag=wx.EXPAND | wx.ALL, border=10)
# 显示源文件夹路径
self.src_folder_text = wx.TextCtrl(panel, style=wx.TE_READONLY)
vbox.Add(self.src_folder_text, flag=wx.EXPAND | wx.ALL, border=10)
# 目标文件夹选择按钮
self.dst_folder_button = wx.Button(panel, label="选择目标文件夹")
self.dst_folder_button.Bind(wx.EVT_BUTTON, self.onSelectDestinationFolder)
vbox.Add(self.dst_folder_button, flag=wx.EXPAND | wx.ALL, border=10)
# 显示目标文件夹路径
self.dst_folder_text = wx.TextCtrl(panel, style=wx.TE_READONLY)
vbox.Add(self.dst_folder_text, flag=wx.EXPAND | wx.ALL, border=10)
# 复制按钮
self.copy_button = wx.Button(panel, label="复制文件")
self.copy_button.Bind(wx.EVT_BUTTON, self.onCopyFiles)
vbox.Add(self.copy_button, flag=wx.EXPAND | wx.ALL, border=10)
panel.SetSizer(vbox)
def onSelectSourceFolder(self, event):
# 弹出文件夹选择对话框
dlg = wx.DirDialog(self, "选择源文件夹", style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
self.src_folder_text.SetValue(dlg.GetPath())
dlg.Destroy()
def onSelectDestinationFolder(self, event):
# 弹出文件夹选择对话框
dlg = wx.DirDialog(self, "选择目标文件夹", style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
self.dst_folder_text.SetValue(dlg.GetPath())
dlg.Destroy()
def onCopyFiles(self, event):
src_folder = self.src_folder_text.GetValue()
dst_folder = self.dst_folder_text.GetValue()
if not src_folder or not dst_folder:
wx.MessageBox("请先选择源文件夹和目标文件夹", "错误", wx.ICON_ERROR)
return
# 创建目标文件夹中以当前日期命名的子文件夹 (格式:yyyymmdd)
today = datetime.today().strftime('%Y%m%d')
date_folder = os.path.join(dst_folder, today)
if not os.path.exists(date_folder):
os.makedirs(date_folder)
# 遍历源文件夹中的所有文件,复制到目标文件夹中的日期子文件夹
for filename in os.listdir(src_folder):
src_file = os.path.join(src_folder, filename)
dst_file = os.path.join(date_folder, filename)
if os.path.isfile(src_file):
shutil.copy(src_file, dst_file)
wx.MessageBox("文件复制完成", "成功", wx.ICON_INFORMATION)
# 运行应用程序
def main():
app = wx.App(False)
frame = FileCopyApp(None, title='文件复制工具')
frame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
2. 功能解释
- 主窗口:创建了一个包含两个按钮(选择源文件夹和目标文件夹)以及对应的文本框来显示文件夹路径的窗口。
- 选择源文件夹:使用
wx.DirDialog
弹出文件夹选择对话框,让用户选择源文件夹路径。 - 选择目标文件夹:同样地,使用
wx.DirDialog
让用户选择目标文件夹路径。 - 文件复制:当用户点击“复制文件”按钮时,程序会获取源文件夹和目标文件夹路径,然后在目标文件夹中以当前日期(
yyyymmdd
)为名称创建一个子文件夹,并将源文件夹中的所有文件复制到该子文件夹中。
3. 运行和使用
- 启动程序后,您会看到一个简单的 GUI 窗口。
- 点击 “选择源文件夹” 按钮,选择需要复制文件的源文件夹。
- 点击 “选择目标文件夹” 按钮,选择要将文件复制到的目标文件夹。
- 点击 “复制文件” 按钮,程序会自动将源文件夹中的所有文件复制到目标文件夹中,以当前日期为名称创建一个子文件夹。
4. 异常处理
我们添加了错误检查机制,确保:
- 用户没有选择文件夹时,程序会弹出错误提示。
- 目标文件夹不存在时,程序会自动创建一个新的日期文件夹。