翼度科技»论坛 编程开发 python 查看内容

Python使用everything库构建文件搜索和管理工具

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
项目概述

这个工具的主要功能包括:

  • 文件搜索:用户可以输入关键字来搜索文件。
  • 文件管理:用户可以查看搜索结果,选择文件并将其添加到管理列表。
  • 数据导出:用户可以将管理列表中的文件信息导出为 Excel 文件。
  • 配置文件生成:用户可以生成配置文件,方便后续使用。

环境准备

确保安装了以下库:
  1. pip install wxPython pandas pywin32,everytools
复制代码
代码实现

以下是完整的代码实现:
  1. import wx
  2. from everytools import EveryTools
  3. import pandas as pd
  4. import os
  5. import pythoncom
  6. import win32com.client

  7. class MyFrame(wx.Frame):
  8.     def __init__(self, *args, **kw):
  9.         super(MyFrame, self).__init__(*args, **kw)
  10.         
  11.         self.InitUI()
  12.         self.all_items = []  # 用于存储ListView1的所有项目
  13.         
  14.     def InitUI(self):
  15.         panel = wx.Panel(self)
  16.         vbox = wx.BoxSizer(wx.VERTICAL)
  17.         
  18.         # 搜索框
  19.         self.search_ctrl = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)
  20.         self.search_ctrl.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
  21.         
  22.         # ListView1
  23.         self.list_ctrl1 = wx.ListCtrl(panel, style=wx.LC_REPORT)
  24.         self.list_ctrl1.InsertColumn(0, 'File Name', width=200)
  25.         self.list_ctrl1.InsertColumn(1, 'File Path', width=300)
  26.         self.list_ctrl1.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)

  27.         # ListView2
  28.         self.list_ctrl2 = wx.ListCtrl(panel, style=wx.LC_REPORT)
  29.         self.list_ctrl2.InsertColumn(0, 'File Name', width=200)
  30.         self.list_ctrl2.InsertColumn(1, 'File Path', width=300)
  31.         
  32.         # 导出Excel按钮
  33.         self.export_button = wx.Button(panel, label='Export to Excel')
  34.         self.export_button.Bind(wx.EVT_BUTTON, self.OnExport)
  35.         
  36.         # 生成配置文件按钮
  37.         self.config_button = wx.Button(panel, label='Generate Config File')
  38.         self.config_button.Bind(wx.EVT_BUTTON, self.OnGenerateConfig)

  39.         # 删除选中项按钮
  40.         self.delete_button = wx.Button(panel, label='Delete Selected')
  41.         self.delete_button.Bind(wx.EVT_BUTTON, self.OnDelete)

  42.         # 过滤框
  43.         self.filter_ctrl = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)
  44.         self.filter_ctrl.SetHint("Search ListView1...")
  45.         self.filter_ctrl.Bind(wx.EVT_TEXT_ENTER, self.OnFilterListView)

  46.         # 布局
  47.         vbox.Add(self.search_ctrl, 0, wx.EXPAND | wx.ALL, 5)
  48.         vbox.Add(self.filter_ctrl, 0, wx.EXPAND | wx.ALL, 5)
  49.         vbox.Add(self.list_ctrl1, 1, wx.EXPAND | wx.ALL, 5)
  50.         vbox.Add(self.list_ctrl2, 1, wx.EXPAND | wx.ALL, 5)
  51.         vbox.Add(self.export_button, 0, wx.EXPAND | wx.ALL, 5)
  52.         vbox.Add(self.config_button, 0, wx.EXPAND | wx.ALL, 5)
  53.         vbox.Add(self.delete_button, 0, wx.EXPAND | wx.ALL, 5)
  54.         
  55.         panel.SetSizer(vbox)
  56.         
  57.         self.SetTitle('File Search and Management')
  58.         self.Centre()
  59.         
  60.     def OnSearch(self, event):
  61.         keyword = self.search_ctrl.GetValue()
  62.         es = EveryTools()
  63.         es.search(keyword)
  64.         
  65.         try:
  66.             results = es.results()
  67.             if results.empty:
  68.                 wx.MessageBox("No results found.", "Info", wx.OK | wx.ICON_INFORMATION)
  69.                 return
  70.         except OSError as e:
  71.             wx.MessageBox(f"Error retrieving results: {e}", "Error", wx.OK | wx.ICON_ERROR)
  72.             return
  73.         except Exception as e:
  74.             wx.MessageBox(f"An unexpected error occurred: {e}", "Error", wx.OK | wx.ICON_ERROR)
  75.             return
  76.         
  77.         if 'name' not in results.columns or 'path' not in results.columns:
  78.             wx.MessageBox("Expected columns 'name' or 'path' not found in results.", "Error", wx.OK | wx.ICON_ERROR)
  79.             return

  80.         self.list_ctrl1.DeleteAllItems()
  81.         self.all_items = []  # 重置存储所有项目的列表
  82.         
  83.         for index, row in results.iterrows():
  84.             self.list_ctrl1.InsertItem(index, row['name'])
  85.             self.list_ctrl1.SetItem(index, 1, row['path'])
  86.             self.all_items.append((row['name'], row['path']))  # 存储所有项目
  87.    
  88.     def OnItemActivated(self, event):
  89.         index = event.GetIndex()
  90.         file_name = self.list_ctrl1.GetItemText(index, 0)
  91.         file_path = self.list_ctrl1.GetItemText(index, 1)
  92.         
  93.         self.list_ctrl2.InsertItem(self.list_ctrl2.GetItemCount(), file_name)
  94.         self.list_ctrl2.SetItem(self.list_ctrl2.GetItemCount() - 1, 1, file_path)
  95.    
  96.     def OnExport(self, event):
  97.         dialog = wx.DirDialog(None, "Choose a directory to save the Excel file:", style=wx.DD_DEFAULT_STYLE)
  98.         
  99.         if dialog.ShowModal() == wx.ID_OK:
  100.             directory = dialog.GetPath()
  101.             file_path = f"{directory}/exported_files.xlsx"
  102.             
  103.             data = []
  104.             for i in range(self.list_ctrl2.GetItemCount()):
  105.                 data.append({
  106.                     'File Name': self.list_ctrl2.GetItemText(i, 0),
  107.                     'File Path': self.list_ctrl2.GetItemText(i, 1)
  108.                 })
  109.             
  110.             df = pd.DataFrame(data)
  111.             df.to_excel(file_path, index=False)
  112.             wx.MessageBox(f"Data exported successfully to {file_path}", "Info", wx.OK | wx.ICON_INFORMATION)
  113.         
  114.         dialog.Destroy()
  115.    
  116.     def OnGenerateConfig(self, event):
  117.         dialog = wx.DirDialog(None, "Choose a directory to save the config file:", style=wx.DD_DEFAULT_STYLE)
  118.         
  119.         if dialog.ShowModal() == wx.ID_OK:
  120.             directory = dialog.GetPath()
  121.             file_path = os.path.join(directory, "buttons.ini")
  122.             
  123.             self.ExportToIni(file_path)
  124.             
  125.             wx.MessageBox(f"Config file generated successfully at {file_path}", "Info", wx.OK | wx.ICON_INFORMATION)
  126.         
  127.         dialog.Destroy()

  128.     def ExportToIni(self, path):
  129.         shell = win32com.client.Dispatch("WScript.Shell")
  130.         
  131.         # with open(path, 'w') as file:
  132.         #     for idx, lnk_path in enumerate(self.get_selected_file_paths(), start=1):
  133.         #         try:
  134.         #             if  lnk_path.endswith('.lnk'):
  135.         #                 shortcut = shell.CreateShortCut(lnk_path)
  136.         #                 target_path = shortcut.Targetpath
  137.         #                 caption = os.path.splitext(os.path.basename(lnk_path))[0]
  138.         #             else:
  139.         #                 # 处理非 .lnk 文件,直接使用文件路径
  140.         #                 target_path = lnk_path
  141.         #                 caption = os.path.splitext(os.path.basename(lnk_path))[0]

  142.         #             file.write(f"[Button{idx}]\n")
  143.         #             file.write(f"caption = {caption}\n")
  144.         #             file.write(f"link = {target_path}\n")
  145.         #             file.write("color = clGreen\n")
  146.         #             file.write("width = 150\n")
  147.         #             file.write("height = 70\n\n")
  148.         #         except Exception as e:
  149.         #             wx.MessageBox(f"Error processing file {lnk_path}: {e}", "Error", wx.OK | wx.ICON_ERROR)
  150.         with open(path, 'w') as file:
  151.             for idx, lnk_path in enumerate(self.get_selected_file_paths(), start=1):
  152.                 try:
  153.                     if lnk_path.lower().endswith('.lnk'):  # 判断文件名后缀是否为".lnk"
  154.                         shortcut = shell.CreateShortCut(lnk_path)
  155.                         target_path = shortcut.Targetpath
  156.                     else:
  157.                         target_path = lnk_path
  158.                     
  159.                     caption = os.path.splitext(os.path.basename(lnk_path))[0]

  160.                     file.write(f"[Button{idx}]\n")
  161.                     file.write(f"caption = {caption}\n")
  162.                     file.write(f"link = {target_path}\n")
  163.                     file.write("color = clGreen\n")
  164.                     file.write("width = 150\n")
  165.                     file.write("height = 70\n\n")
  166.                
  167.                 except Exception as e:
  168.                     wx.MessageBox(f"Error processing file {lnk_path}: {e}", "Error", wx.OK | wx.ICON_ERROR)


  169.     # def get_selected_file_paths(self):
  170.     #     """获取所有选定的文件路径"""
  171.     #     file_paths = []
  172.     #     for i in range(self.list_ctrl2.GetItemCount()):
  173.     #         file_paths.append(self.list_ctrl2.GetItemText(i, 1))
  174.     #     return file_paths
  175.     def get_selected_file_paths(self):
  176.         """获取所有选定的文件路径,包含文件名"""
  177.         file_paths = []
  178.         for i in range(self.list_ctrl2.GetItemCount()):
  179.             directory_path = self.list_ctrl2.GetItemText(i, 1)  # 假设第0列是目录路径
  180.             file_name = self.list_ctrl2.GetItemText(i, 0)       # 假设第1列是文件名
  181.             full_path = os.path.join(directory_path, file_name)
  182.             file_paths.append(full_path)
  183.         return file_paths

  184.     def OnDelete(self, event):
  185.         selected = self.list_ctrl2.GetFirstSelected()
  186.         while selected != -1:
  187.             self.list_ctrl2.DeleteItem(selected)
  188.             selected = self.list_ctrl2.GetFirstSelected()

  189.     def resolve_shortcut(self, path):
  190.         """解析 .lnk 文件,返回它指向的可执行文件完整路径(包含exe名称)"""
  191.         shell = win32com.client.Dispatch("WScript.Shell")
  192.         shortcut = shell.CreateShortCut(path)
  193.         return shortcut.Targetpath

  194.     # def OnFilterListView(self, event):
  195.     #     filter_text = self.filter_ctrl.GetValue().lower()
  196.     #     self.list_ctrl1.DeleteAllItems()
  197.     #     for index, (name, path) in enumerate(self.all_items):
  198.     #         if filter_text in name.lower() or filter_text in path.lower():
  199.     #             self.list_ctrl1.InsertItem(index, name)
  200.     #             self.list_ctrl1.SetItem(index, 1, path)
  201.     # def OnFilterListView(self):
  202.     #     filtered_items = self.filter_items_based_on_some_criteria()
  203.         
  204.     #     self.list_ctrl1.DeleteAllItems()
  205.         
  206.     #     for item in filtered_items:
  207.     #         index = self.list_ctrl1.InsertItem(self.list_ctrl1.GetItemCount(), item[0])
  208.     #         if index != -1:  # 确保索引有效
  209.     #             self.list_ctrl1.SetItem(index, 1, item[1])
  210.     #         else:
  211.     #             wx.MessageBox(f"Failed to insert item {item[0]}", "Error", wx.OK | wx.ICON_ERROR)
  212.     # def OnFilterListView(self, event):
  213.     #     # 从过滤框获取输入的过滤条件
  214.     #     filter_text = self.filter_ctrl.GetValue().lower()
  215.         
  216.     #     # 清空list_ctrl1中的所有项目
  217.     #     self.list_ctrl1.DeleteAllItems()

  218.     #     # 遍历所有项目,找到与过滤条件匹配的项目并重新添加到list_ctrl1中
  219.     #     for index, (name, path) in enumerate(self.all_items):
  220.     #         if filter_text in name.lower() or filter_text in path.lower():
  221.     #             self.list_ctrl1.InsertItem(index, name)
  222.     #             self.list_ctrl1.SetItem(index, 1, path)

  223.     def OnFilterListView(self, event):
  224.         # 从过滤框获取输入的过滤条件
  225.         filter_text = self.filter_ctrl.GetValue().lower()
  226.         
  227.         # 清空list_ctrl1中的所有项目
  228.         self.list_ctrl1.DeleteAllItems()

  229.         # 遍历所有项目,找到与过滤条件匹配的项目并重新添加到list_ctrl1中
  230.         for name, path in self.all_items:
  231.             if filter_text in name.lower() or filter_text in path.lower():
  232.                 # 使用InsertItem返回的index
  233.                 new_index = self.list_ctrl1.InsertItem(self.list_ctrl1.GetItemCount(), name)
  234.                 # 使用返回的index设置第二列
  235.                 self.list_ctrl1.SetItem(new_index, 1, path)

  236. def main():
  237.     app = wx.App()
  238.     frame = MyFrame(None)
  239.     frame.Show()
  240.     app.MainLoop()

  241. if __name__ == '__main__':
  242.     main()
复制代码
代码解析


界面布局

代码使用
  1. wx.BoxSizer
复制代码
来布局界面组件,包括搜索框、两个列表视图和多个按钮。每个组件都有相应的事件绑定,用于处理用户交互。

文件搜索功能

用户在搜索框中输入关键字,按下回车后,程序会调用
  1. EveryTools
复制代码
类进行搜索,并将结果显示在第一个列表视图中。如果没有找到结果,程序会弹出提示框。

文件管理功能

用户可以通过双击搜索结果,将文件添加到第二个列表视图中。选中的文件可以被删除。

数据导出与配置文件生成

用户可以将第二个列表视图中的文件信息导出为 Excel 文件,或生成配置文件。

结果如下



总结

这个简单的文件搜索和管理工具展示了 everytools的基本用法,适合初学者学习和实践。通过这个项目,您可以了解如何处理用户输入、管理列表视图和文件操作等。
以上就是Python使用everything库构建文件搜索和管理工具的详细内容,更多关于Python everything文件搜索和管理的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/python/3264613eu.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具