当前位置: 代码网 > it编程>前端脚本>Python > 使用Python和XML实现文件复制工具的完整代码

使用Python和XML实现文件复制工具的完整代码

2024年08月05日 Python 我要评论
引言在本篇博客中,我们将学习如何使用wxpython构建一个简单的文件复制工具,并将文件路径和目标目录的配置信息保存到xml文件中。通过这种方式,我们可以在下次运行程序时轻松加载之前保存的配置。c:\

引言

在本篇博客中,我们将学习如何使用 wxpython 构建一个简单的文件复制工具,并将文件路径和目标目录的配置信息保存到 xml 文件中。通过这种方式,我们可以在下次运行程序时轻松加载之前保存的配置。
c:\pythoncode\new\preparitowork.py

全部代码

import wx
import os
import shutil
import xml.etree.elementtree as et

class filecopyapp(wx.frame):
    def __init__(self, parent, title):
        super(filecopyapp, self).__init__(parent, title=title, size=(600, 500))

        self.config_file = 'file_copy_config.xml'

        panel = wx.panel(self)
        vbox = wx.boxsizer(wx.vertical)

        self.load_saved_configs()

        self.saved_configs = wx.combobox(panel, choices=list(self.configs.keys()))
        self.saved_configs.bind(wx.evt_combobox, self.on_load_config)
        vbox.add(self.saved_configs, flag=wx.expand | wx.all, border=10)

        self.listbox = wx.listbox(panel)
        vbox.add(self.listbox, proportion=1, flag=wx.expand | wx.all, border=10)

        hbox1 = wx.boxsizer(wx.horizontal)
        self.add_button = wx.button(panel, label='add files')
        self.remove_button = wx.button(panel, label='remove selected')
        hbox1.add(self.add_button, flag=wx.right, border=10)
        hbox1.add(self.remove_button)
        vbox.add(hbox1, flag=wx.align_center | wx.bottom, border=10)

        hbox2 = wx.boxsizer(wx.horizontal)
        self.path_text = wx.textctrl(panel)
        self.browse_button = wx.button(panel, label='browse')
        self.copy_button = wx.button(panel, label='copy files')
        hbox2.add(self.path_text, proportion=1)
        hbox2.add(self.browse_button, flag=wx.left, border=10)
        hbox2.add(self.copy_button, flag=wx.left, border=10)
        vbox.add(hbox2, flag=wx.expand | wx.all, border=10)

        hbox3 = wx.boxsizer(wx.horizontal)
        self.config_name_text = wx.textctrl(panel)
        self.save_config_button = wx.button(panel, label='save configuration')
        hbox3.add(self.config_name_text, proportion=1)
        hbox3.add(self.save_config_button, flag=wx.left, border=10)
        vbox.add(hbox3, flag=wx.expand | wx.all, border=10)

        panel.setsizer(vbox)

        self.bind(wx.evt_button, self.on_add_files, self.add_button)
        self.bind(wx.evt_button, self.on_remove_selected, self.remove_button)
        self.bind(wx.evt_button, self.on_browse, self.browse_button)
        self.bind(wx.evt_button, self.on_copy_files, self.copy_button)
        self.bind(wx.evt_button, self.on_save_config, self.save_config_button)

        self.centre()
        self.show(true)

    def on_add_files(self, event):
        with wx.filedialog(self, "open file(s)", wildcard="all files (*.*)|*.*",
                           style=wx.fd_open | wx.fd_file_must_exist | wx.fd_multiple) as filedialog:
            if filedialog.showmodal() == wx.id_cancel:
                return

            paths = filedialog.getpaths()
            for path in paths:
                self.listbox.append(path)

    def on_remove_selected(self, event):
        selections = self.listbox.getselections()
        for index in reversed(selections):
            self.listbox.delete(index)

    def on_browse(self, event):
        with wx.dirdialog(self, "choose a directory", style=wx.dd_default_style) as dirdialog:
            if dirdialog.showmodal() == wx.id_cancel:
                return

            self.path_text.setvalue(dirdialog.getpath())

    def on_copy_files(self, event):
        target_dir = self.path_text.getvalue()
        if not os.path.isdir(target_dir):
            wx.messagebox('please select a valid directory', 'error', wx.ok | wx.icon_error)
            return

        for i in range(self.listbox.getcount()):
            file_path = self.listbox.getstring(i)
            if os.path.isfile(file_path):
                shutil.copy(file_path, target_dir)

        wx.messagebox('files copied successfully', 'info', wx.ok | wx.icon_information)

    def on_save_config(self, event):
        config_name = self.config_name_text.getvalue().strip()
        if not config_name:
            wx.messagebox('please enter a name for the configuration', 'error', wx.ok | wx.icon_error)
            return

        file_paths = [self.listbox.getstring(i) for i in range(self.listbox.getcount())]
        target_dir = self.path_text.getvalue()

        self.configs[config_name] = {'files': file_paths, 'target_dir': target_dir}
        self.save_configs_to_xml()
        self.saved_configs.append(config_name)
        wx.messagebox('configuration saved successfully', 'info', wx.ok | wx.icon_information)

    def on_load_config(self, event):
        config_name = self.saved_configs.getvalue()
        config = self.configs.get(config_name)

        if config:
            self.listbox.clear()
            for file_path in config['files']:
                self.listbox.append(file_path)

            self.path_text.setvalue(config['target_dir'])

    def load_saved_configs(self):
        self.configs = {}
        if os.path.exists(self.config_file):
            tree = et.parse(self.config_file)
            root = tree.getroot()
            for config in root.findall('config'):
                name = config.get('name')
                files = [file.text for file in config.findall('file')]
                target_dir = config.find('target_dir').text
                self.configs[name] = {'files': files, 'target_dir': target_dir}

    def save_configs_to_xml(self):
        root = et.element('configs')
        for name, data in self.configs.items():
            config_elem = et.subelement(root, 'config', name=name)
            for file_path in data['files']:
                file_elem = et.subelement(config_elem, 'file')
                file_elem.text = file_path
            target_dir_elem = et.subelement(config_elem, 'target_dir')
            target_dir_elem.text = data['target_dir']

        tree = et.elementtree(root)
        tree.write(self.config_file)

if __name__ == '__main__':
    app = wx.app()
    filecopyapp(none, title='file copier')
    app.mainloop()

1. 安装必要的模块

首先,我们需要安装 wxpython 和 lxml 模块。你可以使用以下命令安装这些模块:

pip install wxpython lxml

2. 创建主界面

我们将创建一个 wxpython 应用程序,包含以下几个组件:

  • listbox 用于显示文件路径。
  • 按钮用于添加和移除文件。
  • 文本框和按钮用于选择目标目录。
  • 文本框和按钮用于保存和加载配置。
import wx
import os
import shutil
import xml.etree.elementtree as et

class filecopyapp(wx.frame):
    def __init__(self, parent, title):
        super(filecopyapp, self).__init__(parent, title=title, size=(600, 500))

        self.config_file = 'file_copy_config.xml'

        panel = wx.panel(self)
        vbox = wx.boxsizer(wx.vertical)

        self.load_saved_configs()

        self.saved_configs = wx.combobox(panel, choices=list(self.configs.keys()))
        self.saved_configs.bind(wx.evt_combobox, self.on_load_config)
        vbox.add(self.saved_configs, flag=wx.expand | wx.all, border=10)

        self.listbox = wx.listbox(panel)
        vbox.add(self.listbox, proportion=1, flag=wx.expand | wx.all, border=10)

        hbox1 = wx.boxsizer(wx.horizontal)
        self.add_button = wx.button(panel, label='add files')
        self.remove_button = wx.button(panel, label='remove selected')
        hbox1.add(self.add_button, flag=wx.right, border=10)
        hbox1.add(self.remove_button)
        vbox.add(hbox1, flag=wx.align_center | wx.bottom, border=10)

        hbox2 = wx.boxsizer(wx.horizontal)
        self.path_text = wx.textctrl(panel)
        self.browse_button = wx.button(panel, label='browse')
        self.copy_button = wx.button(panel, label='copy files')
        hbox2.add(self.path_text, proportion=1)
        hbox2.add(self.browse_button, flag=wx.left, border=10)
        hbox2.add(self.copy_button, flag=wx.left, border=10)
        vbox.add(hbox2, flag=wx.expand | wx.all, border=10)

        hbox3 = wx.boxsizer(wx.horizontal)
        self.config_name_text = wx.textctrl(panel)
        self.save_config_button = wx.button(panel, label='save configuration')
        hbox3.add(self.config_name_text, proportion=1)
        hbox3.add(self.save_config_button, flag=wx.left, border=10)
        vbox.add(hbox3, flag=wx.expand | wx.all, border=10)

        panel.setsizer(vbox)

        self.bind(wx.evt_button, self.on_add_files, self.add_button)
        self.bind(wx.evt_button, self.on_remove_selected, self.remove_button)
        self.bind(wx.evt_button, self.on_browse, self.browse_button)
        self.bind(wx.evt_button, self.on_copy_files, self.copy_button)
        self.bind(wx.evt_button, self.on_save_config, self.save_config_button)

        self.centre()
        self.show(true)

3. 实现功能

我们需要实现以下功能:

  • 添加文件路径到 listbox
  • 移除选定的文件路径。
  • 选择目标目录。
  • 复制文件到目标目录。
  • 保存和加载配置。
    def on_add_files(self, event):
        with wx.filedialog(self, "open file(s)", wildcard="all files (*.*)|*.*",
                           style=wx.fd_open | wx.fd_file_must_exist | wx.fd_multiple) as filedialog:
            if filedialog.showmodal() == wx.id_cancel:
                return

            paths = filedialog.getpaths()
            for path in paths:
                self.listbox.append(path)

    def on_remove_selected(self, event):
        selections = self.listbox.getselections()
        for index in reversed(selections):
            self.listbox.delete(index)

    def on_browse(self, event):
        with wx.dirdialog(self, "choose a directory", style=wx.dd_default_style) as dirdialog:
            if dirdialog.showmodal() == wx.id_cancel:
                return

            self.path_text.setvalue(dirdialog.getpath())

    def on_copy_files(self, event):
        target_dir = self.path_text.getvalue()
        if not os.path.isdir(target_dir):
            wx.messagebox('please select a valid directory', 'error', wx.ok | wx.icon_error)
            return

        for i in range(self.listbox.getcount()):
            file_path = self.listbox.getstring(i)
            if os.path.isfile(file_path):
                shutil.copy(file_path, target_dir)

        wx.messagebox('files copied successfully', 'info', wx.ok | wx.icon_information)

4. 保存和加载配置

我们使用 xml 文件保存和加载配置。每个配置包括一个名称、文件路径列表和目标目录。

    def on_save_config(self, event):
        config_name = self.config_name_text.getvalue().strip()
        if not config_name:
            wx.messagebox('please enter a name for the configuration', 'error', wx.ok | wx.icon_error)
            return

        file_paths = [self.listbox.getstring(i) for i in range(self.listbox.getcount())]
        target_dir = self.path_text.getvalue()

        self.configs[config_name] = {'files': file_paths, 'target_dir': target_dir}
        self.save_configs_to_xml()
        self.saved_configs.append(config_name)
        wx.messagebox('configuration saved successfully', 'info', wx.ok | wx.icon_information)

    def on_load_config(self, event):
        config_name = self.saved_configs.getvalue()
        config = self.configs.get(config_name)

        if config:
            self.listbox.clear()
            for file_path in config['files']:
                self.listbox.append(file_path)

            self.path_text.setvalue(config['target_dir'])

    def load_saved_configs(self):
        self.configs = {}
        if os.path.exists(self.config_file):
            tree = et.parse(self.config_file)
            root = tree.getroot()
            for config in root.findall('config'):
                name = config.get('name')
                files = [file.text for file in config.findall('file')]
                target_dir = config.find('target_dir').text
                self.configs[name] = {'files': files, 'target_dir': target_dir}

    def save_configs_to_xml(self):
        root = et.element('configs')
        for name, data in self.configs.items():
            config_elem = et.subelement(root, 'config', name=name)
            for file_path in data['files']:
                file_elem = et.subelement(config_elem, 'file')
                file_elem.text = file_path
            target_dir_elem = et.subelement(config_elem, 'target_dir')
            target_dir_elem.text = data['target_dir']

        tree = et.elementtree(root)
        tree.write(self.config_file)

5. 运行程序

最后,运行程序:

if __name__ == '__main__':
    app = wx.app()
    filecopyapp(none, title='file copier')
    app.mainloop()

结果如下

总结

通过这篇博客,我们学习了如何使用 wxpython 构建一个简单的文件复制工具,并将文件路径和目标目录的配置信息保存到 xml 文件中。我们可以轻松加载和保存配置,使得下次运行程序时可以快速恢复之前的设置。这是一个实用的小工具,可以帮助我们更高效地管理文件复制任务。希望你能从中学到一些有用的技巧,并应用到自己的项目中。

以上就是使用python和xml实现文件复制工具的完整代码的详细内容,更多关于python xml文件复制工具的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com