亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Python?wxPython開發(fā)文件管理工具

 更新時間:2025年02月28日 10:23:00   作者:winfredzhang  
這篇文章主要為大家詳細介紹了如何基于wxPython開發(fā)一個文件管理工具,該工具提供了多種實用功能,代碼結構清晰,易于理解和擴展,需要的可以了解下

前言

比如瀏覽文件夾、導出文件列表、整理特定類型的文件以及比對文本文件內容。本文將詳細分析一個基于wxPython開發(fā)的文件管理工具,該工具提供了多種實用功能,代碼結構清晰,易于理解和擴展。通過學習這個示例,你將掌握如何使用wxPython構建圖形界面應用程序和實現(xiàn)常見的文件操作。

全部代碼

import wx
import os
import shutil
import datetime
import difflib

class FileManagerFrame(wx.Frame):
    def __init__(self, parent, title):
        super(FileManagerFrame, self).__init__(parent, title=title, size=(800, 600))
        
        # 創(chuàng)建面板和工具欄
        self.panel = wx.Panel(self)
        self.toolbar = self.CreateToolBar()
        
        # 添加工具欄按鈕
        browse_tool = self.toolbar.AddTool(wx.ID_ANY, "瀏覽", wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN), "瀏覽文件夾")
        export_tool = self.toolbar.AddTool(wx.ID_ANY, "導出", wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE), "導出結果")
        organize_tool = self.toolbar.AddTool(wx.ID_ANY, "整理", wx.ArtProvider.GetBitmap(wx.ART_REDO), "整理快捷方式")
        compare_tool = self.toolbar.AddTool(wx.ID_ANY, "比對", wx.ArtProvider.GetBitmap(wx.ART_LIST_VIEW), "比對TXT文件")
        
        # 實現(xiàn)工具欄
        self.toolbar.Realize()
        
        # 綁定工具欄事件
        self.Bind(wx.EVT_TOOL, self.OnBrowse, browse_tool)
        self.Bind(wx.EVT_TOOL, self.OnExport, export_tool)
        self.Bind(wx.EVT_TOOL, self.OnOrganize, organize_tool)
        self.Bind(wx.EVT_TOOL, self.OnCompare, compare_tool)
        
        # 創(chuàng)建狀態(tài)欄
        self.statusbar = self.CreateStatusBar()
        self.statusbar.SetStatusText("準備就緒")
        
        # 創(chuàng)建主布局
        main_sizer = wx.BoxSizer(wx.VERTICAL)
        
        # 顯示當前路徑的文本框
        self.path_text = wx.TextCtrl(self.panel, style=wx.TE_READONLY)
        main_sizer.Add(self.path_text, 0, wx.EXPAND | wx.ALL, 5)
        
        # 創(chuàng)建列表框用于顯示文件
        self.listbox = wx.ListBox(self.panel, style=wx.LB_SINGLE)
        main_sizer.Add(self.listbox, 1, wx.EXPAND | wx.ALL, 5)
        
        # 設置布局
        self.panel.SetSizerAndFit(main_sizer)
        
        # 當前選擇的目錄
        self.current_directory = ""
        # 文件列表
        self.file_list = []
        
        # 居中顯示窗口
        self.Center()
        self.Show()

    def OnBrowse(self, event):
        """瀏覽按鈕處理函數(shù)"""
        # 打開目錄選擇對話框
        dlg = wx.DirDialog(self, "選擇要瀏覽的文件夾", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            self.current_directory = dlg.GetPath()
            self.path_text.SetValue(self.current_directory)
            
            # 清空列表
            self.listbox.Clear()
            self.file_list = []
            
            # 開始遍歷文件夾
            self.statusbar.SetStatusText("正在掃描文件夾...")
            self.TraverseDirectory(self.current_directory)
            self.statusbar.SetStatusText(f"掃描完成,共找到 {len(self.file_list)} 個文件")
        
        dlg.Destroy()

    def TraverseDirectory(self, directory):
        """遍歷目錄,獲取所有文件"""
        try:
            for root, dirs, files in os.walk(directory):
                for file in files:
                    file_path = os.path.join(root, file)
                    rel_path = os.path.relpath(file_path, self.current_directory)
                    self.file_list.append(file_path)
                    self.listbox.Append(rel_path)
        except Exception as e:
            wx.MessageBox(f"遍歷目錄時發(fā)生錯誤: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
    
    def OnExport(self, event):
        """導出按鈕處理函數(shù)"""
        if not self.file_list:
            wx.MessageBox("沒有可導出的內容,請先瀏覽文件夾", "提示", wx.OK | wx.ICON_INFORMATION)
            return
        
        # 打開保存文件對話框
        current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        default_filename = f"文件列表_{current_time}.txt"
        
        dlg = wx.FileDialog(
            self, "導出文件列表", wildcard="文本文件 (*.txt)|*.txt",
            style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,
            defaultFile=default_filename
        )
        
        if dlg.ShowModal() == wx.ID_OK:
            save_path = dlg.GetPath()
            try:
                with open(save_path, 'w', encoding='utf-8') as f:
                    f.write(f"文件列表 - {self.current_directory}\n")
                    f.write(f"導出時間: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                    f.write("-" * 50 + "\n\n")
                    
                    for file_path in self.file_list:
                        f.write(f"{file_path}\n")
                
                self.statusbar.SetStatusText(f"成功導出到 {save_path}")
                wx.MessageBox(f"已成功導出文件列表到:\n{save_path}", "導出成功", wx.OK | wx.ICON_INFORMATION)
            
            except Exception as e:
                wx.MessageBox(f"導出文件時發(fā)生錯誤: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
        
        dlg.Destroy()
    
    def OnOrganize(self, event):
        """整理按鈕處理函數(shù)"""
        if not self.file_list:
            wx.MessageBox("沒有可整理的內容,請先瀏覽文件夾", "提示", wx.OK | wx.ICON_INFORMATION)
            return
        
        # 創(chuàng)建快捷方式目錄
        shortcuts_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "shortcuts")
        if not os.path.exists(shortcuts_dir):
            try:
                os.makedirs(shortcuts_dir)
            except Exception as e:
                wx.MessageBox(f"創(chuàng)建快捷方式目錄失敗: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
                return
        
        # 計數(shù)器
        moved_count = 0
        error_count = 0
        
        # 尋找并移動快捷方式文件
        shortcut_extensions = ['.lnk', '.url']  # Windows快捷方式擴展名
        
        for file_path in self.file_list[:]:  # 使用副本進行遍歷
            _, ext = os.path.splitext(file_path)
            if ext.lower() in shortcut_extensions:
                try:
                    # 獲取文件名
                    file_name = os.path.basename(file_path)
                    # 目標路徑
                    dest_path = os.path.join(shortcuts_dir, file_name)
                    
                    # 如果存在同名文件,添加數(shù)字后綴
                    if os.path.exists(dest_path):
                        name, ext = os.path.splitext(file_name)
                        counter = 1
                        while os.path.exists(dest_path):
                            dest_path = os.path.join(shortcuts_dir, f"{name}_{counter}{ext}")
                            counter += 1
                    
                    # 移動文件
                    shutil.move(file_path, dest_path)
                    
                    # 從列表中移除
                    self.file_list.remove(file_path)
                    moved_count += 1
                    
                except Exception as e:
                    error_count += 1
                    print(f"移動文件時出錯: {str(e)}")
        
        # 刷新列表顯示
        self.listbox.Clear()
        for file_path in self.file_list:
            rel_path = os.path.relpath(file_path, self.current_directory)
            self.listbox.Append(rel_path)
        
        # 顯示結果
        if moved_count > 0:
            self.statusbar.SetStatusText(f"已成功移動 {moved_count} 個快捷方式文件")
            wx.MessageBox(
                f"整理完成\n成功移動: {moved_count} 個快捷方式文件\n失敗: {error_count} 個\n\n快捷方式已移動到:\n{shortcuts_dir}",
                "整理完成",
                wx.OK | wx.ICON_INFORMATION
            )
        else:
            self.statusbar.SetStatusText("未找到快捷方式文件")
            wx.MessageBox("未找到快捷方式文件", "提示", wx.OK | wx.ICON_INFORMATION)
    
    def OnCompare(self, event):
        """比對文件按鈕處理函數(shù)"""
        # 創(chuàng)建文件選擇對話框
        dlg = wx.FileDialog(
            self, "選擇第一個TXT文件", wildcard="文本文件 (*.txt)|*.txt",
            style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST
        )
        
        if dlg.ShowModal() != wx.ID_OK:
            dlg.Destroy()
            return
        
        file1_path = dlg.GetPath()
        dlg.Destroy()
        
        # 選擇第二個文件
        dlg = wx.FileDialog(
            self, "選擇第二個TXT文件", wildcard="文本文件 (*.txt)|*.txt",
            style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST
        )
        
        if dlg.ShowModal() != wx.ID_OK:
            dlg.Destroy()
            return
        
        file2_path = dlg.GetPath()
        dlg.Destroy()
        
        # 讀取文件內容
        try:
            with open(file1_path, 'r', encoding='utf-8', errors='replace') as f1:
                content1 = f1.readlines()
            
            with open(file2_path, 'r', encoding='utf-8', errors='replace') as f2:
                content2 = f2.readlines()
            
            # 獲取文件名用于顯示
            file1_name = os.path.basename(file1_path)
            file2_name = os.path.basename(file2_path)
            
            # 使用difflib比對文件
            diff = list(difflib.unified_diff(
                content1, content2, 
                fromfile=file1_name, 
                tofile=file2_name, 
                n=3  # 上下文行數(shù)
            ))
            
            # 如果沒有差異
            if not diff:
                wx.MessageBox(f"文件內容完全相同:\n{file1_name}\n{file2_name}", 
                             "比對結果", wx.OK | wx.ICON_INFORMATION)
                return
            
            # 創(chuàng)建比對結果窗口
            self.ShowCompareResults(file1_name, file2_name, diff)
            
        except Exception as e:
            wx.MessageBox(f"比對文件時發(fā)生錯誤: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
    
    def ShowCompareResults(self, file1_name, file2_name, diff_results):
        """顯示比對結果的對話框"""
        # 創(chuàng)建對話框
        dlg = wx.Dialog(self, title=f"文件比對結果: {file1_name} vs {file2_name}", size=(800, 600))
        
        # 創(chuàng)建布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        
        # 標題標簽
        title_text = wx.StaticText(dlg, label=f"文件比對結果")
        title_text.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
        sizer.Add(title_text, 0, wx.ALL | wx.CENTER, 10)
        
        # 文件信息
        info_text = wx.StaticText(dlg, label=f"比對文件:\n{file1_name}\n{file2_name}")
        sizer.Add(info_text, 0, wx.ALL | wx.EXPAND, 10)
        
        # 創(chuàng)建文本控件顯示比對結果
        diff_text = wx.TextCtrl(dlg, style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL)
        
        # 設置等寬字體便于閱讀差異
        font = wx.Font(10, wx.FONTFAMILY_TELETYPE, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
        diff_text.SetFont(font)
        
        # 使用不同顏色顯示添加和刪除的行
        for line in diff_results:
            if line.startswith('+'):
                # 跳過文件名行
                if not line.startswith('+++ '):
                    diff_text.SetDefaultStyle(wx.TextAttr(wx.Colour(0, 128, 0)))  # 綠色表示添加
            elif line.startswith('-'):
                # 跳過文件名行
                if not line.startswith('--- '):
                    diff_text.SetDefaultStyle(wx.TextAttr(wx.Colour(255, 0, 0)))  # 紅色表示刪除
            else:
                diff_text.SetDefaultStyle(wx.TextAttr(wx.Colour(0, 0, 0)))  # 黑色表示上下文
                
            diff_text.AppendText(line)
        
        sizer.Add(diff_text, 1, wx.ALL | wx.EXPAND, 10)
        
        # 添加導出按鈕
        export_btn = wx.Button(dlg, label="導出比對結果")
        sizer.Add(export_btn, 0, wx.ALL | wx.CENTER, 10)
        
        # 關閉按鈕
        close_btn = wx.Button(dlg, wx.ID_CLOSE, "關閉")
        sizer.Add(close_btn, 0, wx.ALL | wx.CENTER, 10)
        
        # 綁定導出按鈕事件
        export_btn.Bind(wx.EVT_BUTTON, lambda evt, d=diff_results, f1=file1_name, f2=file2_name: 
                        self.ExportCompareResults(d, f1, f2))
        
        # 綁定關閉按鈕事件
        close_btn.Bind(wx.EVT_BUTTON, lambda evt: dlg.EndModal(wx.ID_CLOSE))
        
        # 設置布局
        dlg.SetSizer(sizer)
        
        # 顯示對話框
        dlg.ShowModal()
        dlg.Destroy()
    
    def ExportCompareResults(self, diff_results, file1_name, file2_name):
        """導出比對結果"""
        # 創(chuàng)建保存文件對話框
        current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        default_filename = f"比對結果_{current_time}.txt"
        
        dlg = wx.FileDialog(
            self, "保存比對結果", wildcard="文本文件 (*.txt)|*.txt",
            style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,
            defaultFile=default_filename
        )
        
        if dlg.ShowModal() == wx.ID_OK:
            save_path = dlg.GetPath()
            try:
                with open(save_path, 'w', encoding='utf-8') as f:
                    f.write(f"文件比對結果\n")
                    f.write(f"比對時間: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                    f.write(f"文件1: {file1_name}\n")
                    f.write(f"文件2: {file2_name}\n")
                    f.write("-" * 50 + "\n\n")
                    
                    for line in diff_results:
                        f.write(line)
                
                wx.MessageBox(f"比對結果已成功導出到:\n{save_path}", "導出成功", wx.OK | wx.ICON_INFORMATION)
            
            except Exception as e:
                wx.MessageBox(f"導出比對結果時發(fā)生錯誤: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
        
        dlg.Destroy()


def main():
    app = wx.App()
    frame = FileManagerFrame(None, "文件管理工具")
    app.MainLoop()


if __name__ == "__main__":
    main()

一、項目概述

這個文件管理工具具有以下核心功能:

  • 瀏覽文件夾:遞歸遍歷指定文件夾中的所有文件
  • 顯示文件列表:在列表框中展示文件路徑
  • 導出文件列表:將文件列表導出為TXT文檔
  • 整理快捷方式:將快捷鏈接文件(.lnk, .url)移動到指定文件夾
  • 比對文本文檔:對比兩個TXT文件的內容差異并顯示結果

接下來,我們將從界面設計、功能實現(xiàn)到代碼結構等方面進行詳細分析。

二、環(huán)境準備

在開始之前,確保已安裝wxPython庫:

pip install wxpython

wxPython是Python語言的一套優(yōu)秀的GUI圖形庫,它是Python語言對wxWidgets C++跨平臺GUI庫的封裝,提供了豐富的GUI控件和功能。

三、界面設計分析

該應用程序采用了簡潔而功能齊全的界面設計,主要包括以下元素:

1. 主窗口框架

應用程序使用wx.Frame作為主窗口容器,設置了標題和初始大?。?/p>

class FileManagerFrame(wx.Frame):
    def __init__(self, parent, title):
        super(FileManagerFrame, self).__init__(parent, title=title, size=(800, 600))

2. 工具欄設計

工具欄是應用程序的核心導航元素,包含四個功能按鈕,每個按鈕都使用了直觀的圖標:

self.toolbar = self.CreateToolBar()
browse_tool = self.toolbar.AddTool(wx.ID_ANY, "瀏覽", wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN), "瀏覽文件夾")
export_tool = self.toolbar.AddTool(wx.ID_ANY, "導出", wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE), "導出結果")
organize_tool = self.toolbar.AddTool(wx.ID_ANY, "整理", wx.ArtProvider.GetBitmap(wx.ART_REDO), "整理快捷方式")
compare_tool = self.toolbar.AddTool(wx.ID_ANY, "比對", wx.ArtProvider.GetBitmap(wx.ART_LIST_VIEW), "比對TXT文件")
self.toolbar.Realize()

這里使用了wx.ArtProvider提供的標準圖標,這是一個很好的實踐,因為它們在不同平臺上都能保持一致的外觀。

3. 狀態(tài)欄

狀態(tài)欄用于顯示當前操作的狀態(tài)信息,提供了良好的用戶反饋:

self.statusbar = self.CreateStatusBar()
self.statusbar.SetStatusText("準備就緒")

4. 主布局設計

主界面采用垂直的盒子布局(BoxSizer),包含路徑顯示文本框和文件列表框:

main_sizer = wx.BoxSizer(wx.VERTICAL)
self.path_text = wx.TextCtrl(self.panel, style=wx.TE_READONLY)
main_sizer.Add(self.path_text, 0, wx.EXPAND | wx.ALL, 5)
self.listbox = wx.ListBox(self.panel, style=wx.LB_SINGLE)
main_sizer.Add(self.listbox, 1, wx.EXPAND | wx.ALL, 5)

這里的布局使用了比例設置,文件列表框設置為1,可以隨窗口調整大小而自動擴展。

四、核心功能實現(xiàn)分析

1. 文件夾瀏覽功能

瀏覽功能通過OnBrowse方法實現(xiàn),使用wx.DirDialog讓用戶選擇文件夾:

def OnBrowse(self, event):
    dlg = wx.DirDialog(self, "選擇要瀏覽的文件夾", style=wx.DD_DEFAULT_STYLE)
    if dlg.ShowModal() == wx.ID_OK:
        self.current_directory = dlg.GetPath()
        self.path_text.SetValue(self.current_directory)
        
        # 清空列表
        self.listbox.Clear()
        self.file_list = []
        
        # 開始遍歷文件夾
        self.statusbar.SetStatusText("正在掃描文件夾...")
        self.TraverseDirectory(self.current_directory)
        self.statusbar.SetStatusText(f"掃描完成,共找到 {len(self.file_list)} 個文件")
    
    dlg.Destroy()

文件遍歷通過os.walk實現(xiàn)遞歸遍歷,這是Python處理文件系統(tǒng)的標準方法:

def TraverseDirectory(self, directory):
    try:
        for root, dirs, files in os.walk(directory):
            for file in files:
                file_path = os.path.join(root, file)
                rel_path = os.path.relpath(file_path, self.current_directory)
                self.file_list.append(file_path)
                self.listbox.Append(rel_path)
    except Exception as e:
        wx.MessageBox(f"遍歷目錄時發(fā)生錯誤: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)

這里值得注意的是:

  • 使用os.path.relpath計算相對路徑,使顯示更簡潔
  • 添加了異常處理,增強程序的健壯性

2. 導出文件列表功能

導出功能通過OnExport方法實現(xiàn),使用wx.FileDialog讓用戶選擇保存位置:

def OnExport(self, event):
    if not self.file_list:
        wx.MessageBox("沒有可導出的內容,請先瀏覽文件夾", "提示", wx.OK | wx.ICON_INFORMATION)
        return
    
    # 生成默認文件名(包含時間戳)
    current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
    default_filename = f"文件列表_{current_time}.txt"
    
    dlg = wx.FileDialog(
        self, "導出文件列表", wildcard="文本文件 (*.txt)|*.txt",
        style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,
        defaultFile=default_filename
    )
    
    if dlg.ShowModal() == wx.ID_OK:
        save_path = dlg.GetPath()
        try:
            with open(save_path, 'w', encoding='utf-8') as f:
                f.write(f"文件列表 - {self.current_directory}\n")
                f.write(f"導出時間: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                f.write("-" * 50 + "\n\n")
                
                for file_path in self.file_list:
                    f.write(f"{file_path}\n")
            
            self.statusbar.SetStatusText(f"成功導出到 {save_path}")
            wx.MessageBox(f"已成功導出文件列表到:\n{save_path}", "導出成功", wx.OK | wx.ICON_INFORMATION)
        
        except Exception as e:
            wx.MessageBox(f"導出文件時發(fā)生錯誤: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
    
    dlg.Destroy()

這個功能的亮點:

  • 使用時間戳生成默認文件名,避免覆蓋
  • 添加了文件頭信息,包括路徑和時間
  • 使用wx.FD_OVERWRITE_PROMPT標志提示用戶文件已存在

3. 整理快捷方式功能

整理功能通過OnOrganize方法實現(xiàn),將快捷方式文件移動到指定文件夾:

def OnOrganize(self, event):
    if not self.file_list:
        wx.MessageBox("沒有可整理的內容,請先瀏覽文件夾", "提示", wx.OK | wx.ICON_INFORMATION)
        return
    
    # 創(chuàng)建快捷方式目錄
    shortcuts_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "shortcuts")
    if not os.path.exists(shortcuts_dir):
        try:
            os.makedirs(shortcuts_dir)
        except Exception as e:
            wx.MessageBox(f"創(chuàng)建快捷方式目錄失敗: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)
            return
    
    # 計數(shù)器和文件移動邏輯
    moved_count = 0
    error_count = 0
    
    shortcut_extensions = ['.lnk', '.url']
    
    for file_path in self.file_list[:]:  # 使用副本進行遍歷
        _, ext = os.path.splitext(file_path)
        if ext.lower() in shortcut_extensions:
            try:
                # 文件移動邏輯
                file_name = os.path.basename(file_path)
                dest_path = os.path.join(shortcuts_dir, file_name)
                
                # 處理同名文件
                if os.path.exists(dest_path):
                    name, ext = os.path.splitext(file_name)
                    counter = 1
                    while os.path.exists(dest_path):
                        dest_path = os.path.join(shortcuts_dir, f"{name}_{counter}{ext}")
                        counter += 1
                
                shutil.move(file_path, dest_path)
                self.file_list.remove(file_path)
                moved_count += 1
                
            except Exception as e:
                error_count += 1
                print(f"移動文件時出錯: {str(e)}")
    
    # 刷新列表和顯示結果
    # ...

這個功能的技術要點:

  • 使用列表的副本進行遍歷,同時修改原列表
  • 處理文件重名情況,通過添加數(shù)字后綴解決
  • 使用shutil.move進行文件移動操作

4. 文件比對功能

文件比對是本應用的一個亮點功能,通過OnCompare方法實現(xiàn):

def OnCompare(self, event):
    # 選擇第一個文件
    dlg = wx.FileDialog(
        self, "選擇第一個TXT文件", wildcard="文本文件 (*.txt)|*.txt",
        style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST
    )
    
    if dlg.ShowModal() != wx.ID_OK:
        dlg.Destroy()
        return
    
    file1_path = dlg.GetPath()
    dlg.Destroy()
    
    # 選擇第二個文件
    # ...
    
    # 讀取文件內容
    try:
        with open(file1_path, 'r', encoding='utf-8', errors='replace') as f1:
            content1 = f1.readlines()
        
        with open(file2_path, 'r', encoding='utf-8', errors='replace') as f2:
            content2 = f2.readlines()
        
        # 使用difflib比對文件
        diff = list(difflib.unified_diff(
            content1, content2, 
            fromfile=file1_name, 
            tofile=file2_name, 
            n=3  # 上下文行數(shù)
        ))
        
        # 比對結果處理
        # ...

比對結果顯示通過ShowCompareResults方法實現(xiàn),創(chuàng)建一個新對話框:

def ShowCompareResults(self, file1_name, file2_name, diff_results):
    # 創(chuàng)建對話框
    dlg = wx.Dialog(self, title=f"文件比對結果: {file1_name} vs {file2_name}", size=(800, 600))
    
    # 創(chuàng)建布局和控件
    # ...
    
    # 使用不同顏色顯示差異
    for line in diff_results:
        if line.startswith('+'):
            # 跳過文件名行
            if not line.startswith('+++ '):
                diff_text.SetDefaultStyle(wx.TextAttr(wx.Colour(0, 128, 0)))  # 綠色表示添加
        elif line.startswith('-'):
            # 跳過文件名行
            if not line.startswith('--- '):
                diff_text.SetDefaultStyle(wx.TextAttr(wx.Colour(255, 0, 0)))  # 紅色表示刪除
        else:
            diff_text.SetDefaultStyle(wx.TextAttr(wx.Colour(0, 0, 0)))  # 黑色表示上下文
            
        diff_text.AppendText(line)
    
    # 顯示對話框
    # ...

文件比對功能的技術亮點:

  • 使用Python標準庫difflib進行文本比對
  • 采用統(tǒng)一差異格式(unified diff)顯示結果
  • 使用顏色區(qū)分添加、刪除和上下文行,提高可讀性
  • 提供導出比對結果功能

五、代碼架構與設計模式分析

1. 類結構設計

整個應用程序采用了面向對象的設計,主要由FileManagerFrame類構成。這個類繼承自wx.Frame,負責創(chuàng)建主窗口和處理所有事件。這種設計的優(yōu)點是將界面和功能封裝在一起,代碼組織清晰。

2. 事件處理機制

該應用采用wxPython的事件驅動模型,通過Bind方法將事件與處理函數(shù)綁定:

self.Bind(wx.EVT_TOOL, self.OnBrowse, browse_tool)
self.Bind(wx.EVT_TOOL, self.OnExport, export_tool)
self.Bind(wx.EVT_TOOL, self.OnOrganize, organize_tool)
self.Bind(wx.EVT_TOOL, self.OnCompare, compare_tool)

事件處理函數(shù)命名采用了On+事件的規(guī)范,使代碼更易讀和維護。

3. 錯誤處理機制

代碼中廣泛使用了異常處理機制,提高了程序的健壯性:

try:
    # 可能出錯的代碼
except Exception as e:
    wx.MessageBox(f"出錯信息: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)

通過友好的錯誤提示,提升了用戶體驗。

4. 狀態(tài)管理

應用程序維護了當前目錄和文件列表兩個核心狀態(tài)變量:

# 當前選擇的目錄
self.current_directory = ""
# 文件列表
self.file_list = []

各個功能模塊都基于這些狀態(tài)變量工作,體現(xiàn)了良好的狀態(tài)管理設計。

六、代碼優(yōu)化與擴展建議

1. 代碼優(yōu)化點

線程處理:對于大文件夾的遍歷,可以考慮使用線程處理,避免界面凍結:

import threading

def OnBrowse(self, event):
    # ...
    # 使用線程處理耗時操作
    threading.Thread(target=self.TraverseDirectoryThread, args=(self.current_directory,)).start()

def TraverseDirectoryThread(self, directory):
    # 遍歷邏輯
    # 完成后使用wx.CallAfter更新UI
    wx.CallAfter(self.UpdateFileList, file_list)

配置持久化:添加配置保存功能,記住上次操作的路徑:

import json

def SaveConfig(self):
    config = {
        'last_directory': self.current_directory
    }
    with open('config.json', 'w') as f:
        json.dump(config, f)

def LoadConfig(self):
    try:
        with open('config.json', 'r') as f:
            config = json.load(f)
            self.current_directory = config.get('last_directory', '')
    except:
        pass

文件過濾功能:添加文件過濾選項,只顯示特定類型的文件:

def TraverseDirectory(self, directory, file_filter="*.*"):
    # 根據(jù)filter過濾文件
    import fnmatch
    # ...
    if fnmatch.fnmatch(file, file_filter):
        # 添加到列表

2. 可擴展功能

文件預覽:添加文本文件內容預覽功能

文件搜索:添加按文件名搜索功能

文件操作:增加復制、刪除、重命名等基本文件操作

多標簽支持:支持同時瀏覽多個文件夾

拖放支持:支持文件拖放功能

3.運行結果

以上就是基于Python wxPython開發(fā)文件管理工具的詳細內容,更多關于Python文件管理的資料請關注腳本之家其它相關文章!

相關文章

  • Python??序列化反序列化和異常處理的問題小結

    Python??序列化反序列化和異常處理的問題小結

    這篇文章主要介紹了Python?序列化反序列化和異常處理,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Python中re模塊的常用方法總結

    Python中re模塊的常用方法總結

    這篇文章主要給大家介紹了關于Python中re模塊的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • python中with的具體用法

    python中with的具體用法

    本文主要介紹了python中with的基本使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Django搭建MySQL主從實現(xiàn)讀寫分離

    Django搭建MySQL主從實現(xiàn)讀寫分離

    本文主要介紹了Django搭建MySQL主從實現(xiàn)讀寫分離,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 在?Python?中讀取?gzip?文件的過程解析

    在?Python?中讀取?gzip?文件的過程解析

    這篇文章主要介紹了在?Python?中讀取?gzip?文件,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • python光學仿真通過菲涅耳公式實現(xiàn)波動模型

    python光學仿真通過菲涅耳公式實現(xiàn)波動模型

    這篇文章主要介紹了python光學仿真通過菲涅耳公式實現(xiàn)波動模型的示例解析原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • python數(shù)字轉對應中文的方法總結

    python數(shù)字轉對應中文的方法總結

    在本篇文章里小編給大家分享的是一篇關于python數(shù)字轉對應中文的方法總結內容,有興趣的朋友們可以跟著猜嘗試測試下。
    2021-08-08
  • pip matplotlib報錯equired packages can not be built解決

    pip matplotlib報錯equired packages can not be built解決

    這篇文章主要介紹了pip matplotlib報錯equired packages can not be built解決,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python numpy 提取矩陣的某一行或某一列的實例

    Python numpy 提取矩陣的某一行或某一列的實例

    下面小編就為大家分享一篇Python numpy 提取矩陣的某一行或某一列的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python逆序打印各位數(shù)字的方法

    python逆序打印各位數(shù)字的方法

    今天小編就為大家分享一篇python逆序打印各位數(shù)字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06

最新評論