引言
在本篇博客中,我们将学习如何使用 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文件复制工具的资料请关注代码网其它相关文章!
发表评论