欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用everything庫構建文件搜索和管理工具

 更新時間:2024年08月25日 15:43:21   作者:winfredzhang  
在這篇博客中,我將分享如何使用 Python 的 everytools庫構建一個簡單的文件搜索和管理工具,這個工具允許用戶搜索文件、查看文件路徑、導出文件信息到 Excel,以及生成配置文件,文中有相關的代碼示例供大家參考,需要的朋友可以參考下

項目概述

這個工具的主要功能包括:

  • 文件搜索:用戶可以輸入關鍵字來搜索文件。
  • 文件管理:用戶可以查看搜索結果,選擇文件并將其添加到管理列表。
  • 數(shù)據(jù)導出:用戶可以將管理列表中的文件信息導出為 Excel 文件。
  • 配置文件生成:用戶可以生成配置文件,方便后續(xù)使用。

環(huán)境準備

確保安裝了以下庫:

pip install wxPython pandas pywin32,everytools 

代碼實現(xiàn)

以下是完整的代碼實現(xiàn):

import wx
from everytools import EveryTools
import pandas as pd
import os
import pythoncom
import win32com.client

class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(MyFrame, self).__init__(*args, **kw)
        
        self.InitUI()
        self.all_items = []  # 用于存儲ListView1的所有項目
        
    def InitUI(self):
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)
        
        # 搜索框
        self.search_ctrl = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)
        self.search_ctrl.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
        
        # ListView1
        self.list_ctrl1 = wx.ListCtrl(panel, style=wx.LC_REPORT)
        self.list_ctrl1.InsertColumn(0, 'File Name', width=200)
        self.list_ctrl1.InsertColumn(1, 'File Path', width=300)
        self.list_ctrl1.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)

        # ListView2
        self.list_ctrl2 = wx.ListCtrl(panel, style=wx.LC_REPORT)
        self.list_ctrl2.InsertColumn(0, 'File Name', width=200)
        self.list_ctrl2.InsertColumn(1, 'File Path', width=300)
        
        # 導出Excel按鈕
        self.export_button = wx.Button(panel, label='Export to Excel')
        self.export_button.Bind(wx.EVT_BUTTON, self.OnExport)
        
        # 生成配置文件按鈕
        self.config_button = wx.Button(panel, label='Generate Config File')
        self.config_button.Bind(wx.EVT_BUTTON, self.OnGenerateConfig)

        # 刪除選中項按鈕
        self.delete_button = wx.Button(panel, label='Delete Selected')
        self.delete_button.Bind(wx.EVT_BUTTON, self.OnDelete)

        # 過濾框
        self.filter_ctrl = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)
        self.filter_ctrl.SetHint("Search ListView1...")
        self.filter_ctrl.Bind(wx.EVT_TEXT_ENTER, self.OnFilterListView)

        # 布局
        vbox.Add(self.search_ctrl, 0, wx.EXPAND | wx.ALL, 5)
        vbox.Add(self.filter_ctrl, 0, wx.EXPAND | wx.ALL, 5)
        vbox.Add(self.list_ctrl1, 1, wx.EXPAND | wx.ALL, 5)
        vbox.Add(self.list_ctrl2, 1, wx.EXPAND | wx.ALL, 5)
        vbox.Add(self.export_button, 0, wx.EXPAND | wx.ALL, 5)
        vbox.Add(self.config_button, 0, wx.EXPAND | wx.ALL, 5)
        vbox.Add(self.delete_button, 0, wx.EXPAND | wx.ALL, 5)
        
        panel.SetSizer(vbox)
        
        self.SetTitle('File Search and Management')
        self.Centre()
        
    def OnSearch(self, event):
        keyword = self.search_ctrl.GetValue()
        es = EveryTools()
        es.search(keyword)
        
        try:
            results = es.results()
            if results.empty:
                wx.MessageBox("No results found.", "Info", wx.OK | wx.ICON_INFORMATION)
                return
        except OSError as e:
            wx.MessageBox(f"Error retrieving results: {e}", "Error", wx.OK | wx.ICON_ERROR)
            return
        except Exception as e:
            wx.MessageBox(f"An unexpected error occurred: {e}", "Error", wx.OK | wx.ICON_ERROR)
            return
        
        if 'name' not in results.columns or 'path' not in results.columns:
            wx.MessageBox("Expected columns 'name' or 'path' not found in results.", "Error", wx.OK | wx.ICON_ERROR)
            return

        self.list_ctrl1.DeleteAllItems()
        self.all_items = []  # 重置存儲所有項目的列表
        
        for index, row in results.iterrows():
            self.list_ctrl1.InsertItem(index, row['name'])
            self.list_ctrl1.SetItem(index, 1, row['path'])
            self.all_items.append((row['name'], row['path']))  # 存儲所有項目
    
    def OnItemActivated(self, event):
        index = event.GetIndex()
        file_name = self.list_ctrl1.GetItemText(index, 0)
        file_path = self.list_ctrl1.GetItemText(index, 1)
        
        self.list_ctrl2.InsertItem(self.list_ctrl2.GetItemCount(), file_name)
        self.list_ctrl2.SetItem(self.list_ctrl2.GetItemCount() - 1, 1, file_path)
    
    def OnExport(self, event):
        dialog = wx.DirDialog(None, "Choose a directory to save the Excel file:", style=wx.DD_DEFAULT_STYLE)
        
        if dialog.ShowModal() == wx.ID_OK:
            directory = dialog.GetPath()
            file_path = f"{directory}/exported_files.xlsx"
            
            data = []
            for i in range(self.list_ctrl2.GetItemCount()):
                data.append({
                    'File Name': self.list_ctrl2.GetItemText(i, 0),
                    'File Path': self.list_ctrl2.GetItemText(i, 1)
                })
            
            df = pd.DataFrame(data)
            df.to_excel(file_path, index=False)
            wx.MessageBox(f"Data exported successfully to {file_path}", "Info", wx.OK | wx.ICON_INFORMATION)
        
        dialog.Destroy()
    
    def OnGenerateConfig(self, event):
        dialog = wx.DirDialog(None, "Choose a directory to save the config file:", style=wx.DD_DEFAULT_STYLE)
        
        if dialog.ShowModal() == wx.ID_OK:
            directory = dialog.GetPath()
            file_path = os.path.join(directory, "buttons.ini")
            
            self.ExportToIni(file_path)
            
            wx.MessageBox(f"Config file generated successfully at {file_path}", "Info", wx.OK | wx.ICON_INFORMATION)
        
        dialog.Destroy()

    def ExportToIni(self, path):
        shell = win32com.client.Dispatch("WScript.Shell")
        
        # with open(path, 'w') as file:
        #     for idx, lnk_path in enumerate(self.get_selected_file_paths(), start=1):
        #         try:
        #             if  lnk_path.endswith('.lnk'):
        #                 shortcut = shell.CreateShortCut(lnk_path)
        #                 target_path = shortcut.Targetpath
        #                 caption = os.path.splitext(os.path.basename(lnk_path))[0]
        #             else:
        #                 # 處理非 .lnk 文件,直接使用文件路徑
        #                 target_path = lnk_path
        #                 caption = os.path.splitext(os.path.basename(lnk_path))[0]

        #             file.write(f"[Button{idx}]\n")
        #             file.write(f"caption = {caption}\n")
        #             file.write(f"link = {target_path}\n")
        #             file.write("color = clGreen\n")
        #             file.write("width = 150\n")
        #             file.write("height = 70\n\n")
        #         except Exception as e:
        #             wx.MessageBox(f"Error processing file {lnk_path}: {e}", "Error", wx.OK | wx.ICON_ERROR)
        with open(path, 'w') as file:
            for idx, lnk_path in enumerate(self.get_selected_file_paths(), start=1):
                try:
                    if lnk_path.lower().endswith('.lnk'):  # 判斷文件名后綴是否為".lnk"
                        shortcut = shell.CreateShortCut(lnk_path)
                        target_path = shortcut.Targetpath
                    else:
                        target_path = lnk_path
                    
                    caption = os.path.splitext(os.path.basename(lnk_path))[0]

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


    # def get_selected_file_paths(self):
    #     """獲取所有選定的文件路徑"""
    #     file_paths = []
    #     for i in range(self.list_ctrl2.GetItemCount()):
    #         file_paths.append(self.list_ctrl2.GetItemText(i, 1))
    #     return file_paths
    def get_selected_file_paths(self):
        """獲取所有選定的文件路徑,包含文件名"""
        file_paths = []
        for i in range(self.list_ctrl2.GetItemCount()):
            directory_path = self.list_ctrl2.GetItemText(i, 1)  # 假設第0列是目錄路徑
            file_name = self.list_ctrl2.GetItemText(i, 0)       # 假設第1列是文件名
            full_path = os.path.join(directory_path, file_name)
            file_paths.append(full_path)
        return file_paths

    def OnDelete(self, event):
        selected = self.list_ctrl2.GetFirstSelected()
        while selected != -1:
            self.list_ctrl2.DeleteItem(selected)
            selected = self.list_ctrl2.GetFirstSelected()

    def resolve_shortcut(self, path):
        """解析 .lnk 文件,返回它指向的可執(zhí)行文件完整路徑(包含exe名稱)"""
        shell = win32com.client.Dispatch("WScript.Shell")
        shortcut = shell.CreateShortCut(path)
        return shortcut.Targetpath

    # def OnFilterListView(self, event):
    #     filter_text = self.filter_ctrl.GetValue().lower()
    #     self.list_ctrl1.DeleteAllItems()
    #     for index, (name, path) in enumerate(self.all_items):
    #         if filter_text in name.lower() or filter_text in path.lower():
    #             self.list_ctrl1.InsertItem(index, name)
    #             self.list_ctrl1.SetItem(index, 1, path)
    # def OnFilterListView(self):
    #     filtered_items = self.filter_items_based_on_some_criteria()
        
    #     self.list_ctrl1.DeleteAllItems()
        
    #     for item in filtered_items:
    #         index = self.list_ctrl1.InsertItem(self.list_ctrl1.GetItemCount(), item[0])
    #         if index != -1:  # 確保索引有效
    #             self.list_ctrl1.SetItem(index, 1, item[1])
    #         else:
    #             wx.MessageBox(f"Failed to insert item {item[0]}", "Error", wx.OK | wx.ICON_ERROR)
    # def OnFilterListView(self, event):
    #     # 從過濾框獲取輸入的過濾條件
    #     filter_text = self.filter_ctrl.GetValue().lower()
        
    #     # 清空list_ctrl1中的所有項目
    #     self.list_ctrl1.DeleteAllItems()

    #     # 遍歷所有項目,找到與過濾條件匹配的項目并重新添加到list_ctrl1中
    #     for index, (name, path) in enumerate(self.all_items):
    #         if filter_text in name.lower() or filter_text in path.lower():
    #             self.list_ctrl1.InsertItem(index, name)
    #             self.list_ctrl1.SetItem(index, 1, path)

    def OnFilterListView(self, event):
        # 從過濾框獲取輸入的過濾條件
        filter_text = self.filter_ctrl.GetValue().lower()
        
        # 清空list_ctrl1中的所有項目
        self.list_ctrl1.DeleteAllItems()

        # 遍歷所有項目,找到與過濾條件匹配的項目并重新添加到list_ctrl1中
        for name, path in self.all_items:
            if filter_text in name.lower() or filter_text in path.lower():
                # 使用InsertItem返回的index
                new_index = self.list_ctrl1.InsertItem(self.list_ctrl1.GetItemCount(), name)
                # 使用返回的index設置第二列
                self.list_ctrl1.SetItem(new_index, 1, path)

def main():
    app = wx.App()
    frame = MyFrame(None)
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

代碼解析

界面布局

代碼使用 wx.BoxSizer 來布局界面組件,包括搜索框、兩個列表視圖和多個按鈕。每個組件都有相應的事件綁定,用于處理用戶交互。

文件搜索功能

用戶在搜索框中輸入關鍵字,按下回車后,程序會調(diào)用 EveryTools 類進行搜索,并將結果顯示在第一個列表視圖中。如果沒有找到結果,程序會彈出提示框。

文件管理功能

用戶可以通過雙擊搜索結果,將文件添加到第二個列表視圖中。選中的文件可以被刪除。

數(shù)據(jù)導出與配置文件生成

用戶可以將第二個列表視圖中的文件信息導出為 Excel 文件,或生成配置文件。

結果如下

總結

這個簡單的文件搜索和管理工具展示了 everytools的基本用法,適合初學者學習和實踐。通過這個項目,您可以了解如何處理用戶輸入、管理列表視圖和文件操作等。

以上就是Python使用everything庫構建文件搜索和管理工具的詳細內(nèi)容,更多關于Python everything文件搜索和管理的資料請關注腳本之家其它相關文章!

相關文章

  • Python3如何解決字符編碼問題詳解

    Python3如何解決字符編碼問題詳解

    字符串是一種數(shù)據(jù)類型,但是,字符串比較特殊的是還有一個編碼問題。下面這篇文章主要給大家介紹了關于Python3如何解決字符編碼問題的相關資料,文中介紹的還是相對比較詳細的,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • python3實現(xiàn)163郵箱SMTP發(fā)送郵件

    python3實現(xiàn)163郵箱SMTP發(fā)送郵件

    這篇文章主要為大家詳細介紹了Python3實現(xiàn)163郵箱SMTP發(fā)送郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 使用python批量轉換文件編碼為UTF-8的實現(xiàn)

    使用python批量轉換文件編碼為UTF-8的實現(xiàn)

    這篇文章主要介紹了使用python批量轉換文件編碼為UTF-8的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Python字典添加,刪除,查詢等相關操作方法詳解

    Python字典添加,刪除,查詢等相關操作方法詳解

    這篇文章主要介紹了Python字典添加,刪除,查詢等相關操作方法詳解,需要的朋友可以參考下
    2020-02-02
  • 如何使用Python處理HDF格式數(shù)據(jù)及可視化問題

    如何使用Python處理HDF格式數(shù)據(jù)及可視化問題

    這篇文章主要介紹了如何使用Python處理HDF格式數(shù)據(jù)及可視化問題,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • PyTorch中Tensor的拼接與拆分的實現(xiàn)

    PyTorch中Tensor的拼接與拆分的實現(xiàn)

    這篇文章主要介紹了PyTorch中Tensor的拼接與拆分的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • python實現(xiàn)帶界面的井字棋小游戲

    python實現(xiàn)帶界面的井字棋小游戲

    這篇文章我們主要介紹的是python實現(xiàn)帶界面的井字棋小游戲,從安裝tkinter開始,然后初始化窗口,定義按鈕即查找獲勝條件,想具體了解的小伙伴可以參考下文,附有詳細代碼
    2021-09-09
  • 淺談python函數(shù)之作用域(python3.5)

    淺談python函數(shù)之作用域(python3.5)

    下面小編就為大家?guī)硪黄獪\談python函數(shù)之作用域(python3.5)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 利用python獲取想要搜索的數(shù)據(jù)

    利用python獲取想要搜索的數(shù)據(jù)

    這篇文章主要介紹了利用Python爬蟲采集想要搜索的信息(利用某du的接口實現(xiàn))并且處理掉它的反爬手段,文中示例代碼很詳細,具有一定的學習價值,感興趣的小伙伴快來一起學習吧
    2023-05-05
  • Python中LSTM回歸神經(jīng)網(wǎng)絡時間序列預測詳情

    Python中LSTM回歸神經(jīng)網(wǎng)絡時間序列預測詳情

    這篇文章主要介紹了Python中LSTM回歸神經(jīng)網(wǎng)絡時間序列預測詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07

最新評論