文章目录
- # 核心依赖 import wx # GUI 框架 import json # 数据持久化 from pathlib import Path # 跨平台路径处理 import shutil # 文件操作 为什么选择 wxPython? 跨平台支持(Windows/Mac/Linux) 原生界面风格,性能优秀 丰富的控件库(ListCtrl、Notebook、SpinCtrl 等)
-
- { “/Users/username/Desktop/report.pdf”: { “access_count”: 15, “last_access”: 1705132800.0, “created”: 1704528000.0 } } 核心字段: access_count:访问次数(累计) last_access:最后访问时间戳 created:文件创建时间
- file_info = { ‘path’: str, # 完整路径 ‘name’: str, # 文件名 ‘is_dir’: bool, # 是否为目录 ‘size’: int, # 字节大小 ‘created’: float, # 创建时间戳 ‘modified’: float, # 修改时间戳 ‘accessed’: float # 访问时间戳 }
- DesktopOrganizer (主类)├── UI 层│ ├── 统计信息区 (stats_text)│ ├── 标签页 (Notebook)│ │ ├── 整理建议页 (suggestions_panel)│ │ ├── 使用分析页 (analysis_panel)│ │ └── 设置页 (settings_panel)│ └── 操作按钮区 (扫描/整理/撤销)├── 数据层│ ├── usage_data (使用数据字典)│ └── suggestions (建议列表)└── 业务逻辑层 ├── 扫描模块 (scan_desktop) ├── 分析模块 (generate_suggestions) ├── 执行模块 (apply_organization) └── 监控模块 (定时器)
- def __init__(self): super().__init__(None, title=”智能桌面整理助手”, size=(900, 700)) # 获取桌面路径(跨平台) self.desktop_path = Path.home() / “Desktop” # 数据存储在用户主目录(隐藏文件) self.data_file = Path.home() / “.desktop_organizer_data.json” self.usage_data = self.load_usage_data() # 创建三个整理区域 self.organize_root = self.desktop_path / “桌面整理” self.focus_zone = self.organize_root / “专注区” self.assist_zone = self.organize_root / “辅助区” self.temp_zone = self.organize_root / “临时区” 设计亮点: 使用 Path.home() 实现跨平台兼容 数据文件以点开头(.desktop_organizer_data.json)在 Unix 系统中自动隐藏 预定义三区路径,便于后续操作
-
- def init_ui(self): panel = wx.Panel(self) main_sizer = wx.BoxSizer(wx.VERTICAL) # 1. 标题区域 title = wx.StaticText(panel, label=”🎯 智能桌面整理助手”) title_font = wx.Font(16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD) title.SetFont(title_font) # 2. 统计信息区 stats_box = wx.StaticBoxSizer(wx.VERTICAL, panel, “桌面统计”) self.stats_text = wx.StaticText(panel, label=”正在扫描…”) # 3. 标签页组件 notebook = wx.Notebook(panel) notebook.AddPage(self.suggestions_panel, “整理建议”) notebook.AddPage(self.analysis_panel, “使用分析”) notebook.AddPage(self.settings_panel, “设置”) 技术细节: BoxSizer 实现垂直布局的响应式设计 StaticBoxSizer 创建带边框的分组区域 Notebook 组件实现标签页切换
- self.suggestions_list = wx.ListCtrl(panel, style=wx.LC_REPORT | wx.LC_SINGLE_SEL) self.suggestions_list.AppendColumn(“文件名”, width=250) self.suggestions_list.AppendColumn(“类型”, width=80) self.suggestions_list.AppendColumn(“使用频率”, width=100) self.suggestions_list.AppendColumn(“建议操作”, width=150) self.suggestions_list.AppendColumn(“原因”, width=250) ListCtrl 风格说明: wx.LC_REPORT:报告模式(多列列表) wx.LC_SINGLE_SEL:单选模式
- def scan_desktop(self): if not self.desktop_path.exists(): return files = [] total_size = 0 try: for item in self.desktop_path.iterdir(): # 跳过隐藏文件和整理目录 if item.name.startswith(‘.’) or item.name == ‘桌面整理’: continue # 获取文件元数据 stat = item.stat() file_info = { ‘path’: str(item), ‘name’: item.name, ‘is_dir’: item.is_dir(), ‘size’: stat.st_size, ‘created’: stat.st_ctime, ‘modified’: stat.st_mtime, ‘accessed’: stat.st_atime } # 更新使用数据 file_key = str(item) if file_key not in self.usage_data: # 新文件:初始化记录 self.usage_data[file_key] = { ‘access_count’: 0, ‘last_access’: stat.st_atime, ‘created’: stat.st_ctime } else: # 已存在:检测访问时间变化 if stat.st_atime > self.usage_data[file_key][‘last_access’]: self.usage_data[file_key][‘access_count’] += 1 self.usage_data[file_key][‘last_access’] = stat.st_atime files.append(file_info) total_size += stat.st_size except Exception as e: wx.MessageBox(f”扫描失败: {str(e)}”, “错误”, wx.OK | wx.ICON_ERROR) return # 保存数据并更新 UI self.save_usage_data() self.update_statistics(files, total_size) self.generate_suggestions(files) self.update_analysis(files) 关键技术点: 访问时间检测机制 if stat.st_atime > self.usage_data[file_key][‘last_access’]: self.usage_data[file_key][‘access_count’] += 1 通过比较文件系统的访问时间戳与上次记录,判断文件是否被使用过。 异常处理 使用 try-except 捕获权限错误或 I/O 异常 通过 wx.MessageBox 友好地展示错误信息 数据持久化 每次扫描后立即保存数据(save_usage_data) 避免程序崩溃导致数据丢失
- def generate_suggestions(self, files): self.suggestions_list.DeleteAllItems() self.suggestions = [] now = time.time() focus_threshold = self.focus_days.GetValue() * 86400 # 转换为秒 assist_threshold = self.assist_days.GetValue() * 86400 for file_info in files: file_key = file_info[‘path’] usage = self.usage_data.get(file_key, {}) # 计算关键指标 last_access = usage.get(‘last_access’, file_info[‘accessed’]) access_count = usage.get(‘access_count’, 0) days_since_access = (now – last_access) / 86400 # 决策逻辑 if days_since_access <= focus_threshold and access_count > 2: suggestion = “保留在专注区” reason = f”最近{int(days_since_access)}天使用过{access_count}次” elif days_since_access <= assist_threshold and access_count > 0: suggestion = “移至辅助区” reason = f”{int(days_since_access)}天前使用,访问{access_count}次” else: suggestion = “移至临时区” reason = f”已{int(days_since_access)}天未使用” # 添加到界面 file_type = “文件夹” if file_info[‘is_dir’] else “文件” freq = “高频” if access_count > 5 else “中频” if access_count > 2 else “低频” idx = self.suggestions_list.InsertItem( self.suggestions_list.GetItemCount(), file_info[‘name’] ) self.suggestions_list.SetItem(idx, 1, file_type) self.suggestions_list.SetItem(idx, 2, freq) self.suggestions_list.SetItem(idx, 3, suggestion) self.suggestions_list.SetItem(idx, 4, reason) 算法设计思路: 决策树:├─ 最近 7 天使用 且 访问次数 > 2 → 专注区(高频使用)├─ 最近 30 天使用 且 访问次数 > 0 → 辅助区(中频使用)└─ 其他 → 临时区(低频/未使用) 参数可调性: 通过 SpinCtrl 组件,用户可以自定义天数阈值 访问次数阈值硬编码(2次、5次),可扩展为可配置项
- def apply_organization(self): try: # 1. 创建目标目录 self.organize_root.mkdir(exist_ok=True) self.focus_zone.mkdir(exist_ok=True) self.assist_zone.mkdir(exist_ok=True) self.temp_zone.mkdir(exist_ok=True) operations = [] # 记录所有操作,用于撤销 for suggestion in self.suggestions: file_info = suggestion[‘file_info’] action = suggestion[‘suggestion’] source = Path(file_info[‘path’]) if not source.exists(): continue # 2. 确定目标目录 if “专注区” in action: target_dir = self.focus_zone elif “辅助区” in action: target_dir = self.assist_zone elif “临时区” in action: target_dir = self.temp_zone else: continue target = target_dir / source.name # 3. 处理文件名冲突 counter = 1 while target.exists(): stem = source.stem suffix = source.suffix target = target_dir / f”{stem}_{counter}{suffix}” counter += 1 # 4. 执行移动 try: shutil.move(str(source), str(target)) operations.append({ ‘source’: str(source), ‘target’: str(target) }) except Exception as e: print(f”移动失败: {source} -> {target}, 错误: {e}”) # 5. 保存撤销日志 if operations: undo_file = self.organize_root / “.undo_log.json” with open(undo_file, ‘w’, encoding=’utf-8′) as f: json.dump(operations, f, ensure_ascii=False, indent=2) self.undo_btn.Enable(True) wx.MessageBox(f”整理完成!共处理 {len(operations)} 个项目”, “成功”, wx.OK | wx.ICON_INFORMATION) self.scan_desktop() except Exception as e: wx.MessageBox(f”整理失败: {str(e)}”, “错误”, wx.OK | wx.ICON_ERROR) 技术亮点: 文件名冲突处理 while target.exists(): target = target_dir / f”{stem}_{counter}{suffix}” counter += 1 自动添加数字后缀(如 report_1.pdf, report_2.pdf) 操作日志设计 [ { “source”: “/Users/xxx/Desktop/file.txt”, “target”: “/Users/xxx/Desktop/桌面整理/临时区/file.txt” } ] 记录源路径和目标路径,为撤销操作提供数据支持 原子性操作 使用 shutil.move 而非 copy + delete 确保移动操作的原子性
- def on_undo(self, event): undo_file = self.organize_root / “.undo_log.json” if not undo_file.exists(): wx.MessageBox(“没有可撤销的操作”, “提示”, wx.OK | wx.ICON_INFORMATION) return try: # 1. 读取操作日志 with open(undo_file, ‘r’, encoding=’utf-8′) as f: operations = json.load(f) # 2. 反向执行所有操作 for op in operations: target = Path(op[‘target’]) source = Path(op[‘source’]) if target.exists(): shutil.move(str(target), str(source)) # 3. 删除日志并禁用撤销按钮 undo_file.unlink() self.undo_btn.Enable(False) wx.MessageBox(“撤销成功!”, “成功”, wx.OK | wx.ICON_INFORMATION) self.scan_desktop() except Exception as e: wx.MessageBox(f”撤销失败: {str(e)}”, “错误”, wx.OK | wx.ICON_ERROR) 撤销机制设计: 撤销操作是"整理操作"的完全逆向 将文件从整理目录移回原始桌面位置 撤销后删除日志文件,避免重复撤销
- # 初始化定时器 self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.on_timer, self.timer) self.timer.Start(300000) # 每 5 分钟(300,000 毫秒) def on_timer(self, event): “””定时扫描””” self.scan_desktop() 定时器机制: 每 5 分钟自动扫描桌面 静默更新使用数据(不弹窗提示) 用户无感知的后台数据采集
- 整理建议页面 文件名 类型 使用频率 建议操作 原因project_report.pdf 文件 高频 保留在专注区 最近3天使用过8次design.psd 文件 中频 移至辅助区 15天前使用,访问3次wallpaper.jpg 文件 低频 移至临时区 已45天未使用 使用分析页面 文件名 访问次数 最后访问 创建时间 大小project_report.pdf 15 2025-01-13 10:30 2024-12-20 09:00 2.3 MBmeeting_notes.docx 7 2025-01-10 14:15 2024-12-15 11:20 156 KBscreenshot.png 1 2024-11-28 16:40 2024-11-28 16:40 1.1 MB
- 整理前(混乱状态): Desktop/├── 项目文档.pdf├── 临时截图1.png├── 临时截图2.png├── 会议记录.docx├── 旧版设计稿.psd├── 下载的表格.xlsx└── … (30+ 个文件) 整理后(有序状态): Desktop/├── 桌面整理/│ ├── 专注区/│ │ ├── 项目文档.pdf│ │ └── 会议记录.docx│ ├── 辅助区/│ │ ├── 旧版设计稿.psd│ │ └── 下载的表格.xlsx│ └── 临时区/│ ├── 临时截图1.png│ └── 临时截图2.png└── (仅保留正在工作的文件)
- 假设运行一周后的数据: { “总扫描次数”: 2016, // 每 5 分钟扫描一次 “追踪文件数”: 47, “平均访问频率”: { “专注区文件”: 12.3, “辅助区文件”: 3.5, “临时区文件”: 0.2 }, “整理操作次数”: 3, “撤销次数”: 1 } 以上就是Python结合wxPython开发一个智能桌面整理助手的详细内容,更多关于Python桌面整理的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: 基于Python开发的桌面级文件备份工具 使用Python开发一个桌面版PDF盖章工具 Python结合PyQt和Flask实现桌面端一键启动/关闭Web服务的应用 基于Python实现局域网内Windows桌面文件传输 Python编写一个Excel批量处理的桌面实用脚本 基于Python开发一个桌面便签工具
目录
- 一、背景:桌面混乱是现代办公的通病
- 二、目标:构建智能而非强制的整理系统
- 2.1 核心设计理念
- 2.2 技术目标
- 三、方法:技术选型与架构设计
- 3.1 技术栈
- 3.2 数据结构设计
- 使用数据存储格式
- 文件信息结构
- 3.3 架构设计
- 四、过程:核心功能实现详解
- 4.1 初始化与环境准备
- 4.2 UI 构建:多标签页设计
- 主界面布局
- 整理建议页:ListCtrl 的使用
- 4.3 文件扫描:核心数据采集
- 4.4 智能建议生成:核心算法
- 4.5 一键整理:文件移动操作
- 4.6 撤销功能:可逆性设计
- 4.7 后台监控:定时扫描
- 五、结果:功能演示与实际效果
- 5.1 界面展示
- 5.2 整理效果
- 5.3 数据统计
你是否也遇到过这样的场景:
- 桌面上堆满了几十个文件,每次找文件都要眼花缭乱地扫描
- 下载的临时文件混杂在重要项目文档中
- 不知道哪些文件还有用,哪些可以删除
- 手动整理太麻烦,很快又会变乱
传统的文件管理工具通常采用"强制分类"的方式——按文件类型(图片、文档、视频)机械地归档。但这种方式忽略了一个核心问题:文件的重要性不是由类型决定的,而是由使用频率决定的。
一个项目核心的 PDF 文档显然比随手保存的截图更重要,但它们可能都被归到同一个"文档"文件夹。这就是为什么我们需要一个基于使用行为的智能整理工具。
本项目的目标是创建一个"智能助手"而非"自动清理器",具体体现在:
- 行为驱动:通过分析文件的访问频率和时间,判断其重要性
- 三区管理:将桌面划分为专注区、辅助区、临时区
- 非强制性:提供建议而非强制执行,用户保留完全控制权
- 可撤销性:所有操作都可以轻松恢复
- 使用 Python + wxPython 构建跨平台图形界面
- 实现文件使用行为的持久化追踪
- 设计直观的可视化分析界面
- 支持自定义规则和一键操作

# 核心依赖
import wx # GUI 框架
import json # 数据持久化
from pathlib import Path # 跨平台路径处理
import shutil # 文件操作
为什么选择 wxPython?
- 跨平台支持(Windows/Mac/Linux)
- 原生界面风格,性能优秀
- 丰富的控件库(ListCtrl、Notebook、SpinCtrl 等)
{
"/Users/username/Desktop/report.pdf": {
"access_count": 15,
"last_access": 1705132800.0,
"created": 1704528000.0
}
}
核心字段:
access_count:访问次数(累计)last_access:最后访问时间戳created:文件创建时间
file_info = {
'path': str, # 完整路径
'name': str, # 文件名
'is_dir': bool, # 是否为目录
'size': int, # 字节大小
'created': float, # 创建时间戳
'modified': float, # 修改时间戳
'accessed': float # 访问时间戳
}
DesktopOrganizer (主类)
├── UI 层
│ ├── 统计信息区 (stats_text)
│ ├── 标签页 (Notebook)
│ │ ├── 整理建议页 (suggestions_panel)
│ │ ├── 使用分析页 (analysis_panel)
│ │ └── 设置页 (settings_panel)
│ └── 操作按钮区 (扫描/整理/撤销)
├── 数据层
│ ├── usage_data (使用数据字典)
│ └── suggestions (建议列表)
└── 业务逻辑层
├── 扫描模块 (scan_desktop)
├── 分析模块 (generate_suggestions)
├── 执行模块 (apply_organization)
└── 监控模块 (定时器)
DesktopOrganizer (主类)
├── UI 层
│ ├── 统计信息区 (stats_text)
│ ├── 标签页 (Notebook)
│ │ ├── 整理建议页 (suggestions_panel)
│ │ ├── 使用分析页 (analysis_panel)
│ │ └── 设置页 (settings_panel)
│ └── 操作按钮区 (扫描/整理/撤销)
├── 数据层
│ ├── usage_data (使用数据字典)
│ └── suggestions (建议列表)
└── 业务逻辑层
├── 扫描模块 (scan_desktop)
├── 分析模块 (generate_suggestions)
├── 执行模块 (apply_organization)
└── 监控模块 (定时器)
def __init__(self):
super().__init__(None, title="智能桌面整理助手", size=(900, 700))
# 获取桌面路径(跨平台)
self.desktop_path = Path.home() / "Desktop"
# 数据存储在用户主目录(隐藏文件)
self.data_file = Path.home() / ".desktop_organizer_data.json"
self.usage_data = self.load_usage_data()
# 创建三个整理区域
self.organize_root = self.desktop_path / "桌面整理"
self.focus_zone = self.organize_root / "专注区"
self.assist_zone = self.organize_root / "辅助区"
self.temp_zone = self.organize_root / "临时区"
设计亮点:
- 使用
Path.home()实现跨平台兼容 - 数据文件以点开头(
.desktop_organizer_data.json)在 Unix 系统中自动隐藏 - 预定义三区路径,便于后续操作
def init_ui(self):
panel = wx.Panel(self)
main_sizer = wx.BoxSizer(wx.VERTICAL)
# 1. 标题区域
title = wx.StaticText(panel, label="🎯 智能桌面整理助手")
title_font = wx.Font(16, wx.FONTFAMILY_DEFAULT,
wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
title.SetFont(title_font)
# 2. 统计信息区
stats_box = wx.StaticBoxSizer(wx.VERTICAL, panel, "桌面统计")
self.stats_text = wx.StaticText(panel, label="正在扫描...")
# 3. 标签页组件
notebook = wx.Notebook(panel)
notebook.AddPage(self.suggestions_panel, "整理建议")
notebook.AddPage(self.analysis_panel, "使用分析")
notebook.AddPage(self.settings_panel, "设置")
技术细节:
BoxSizer实现垂直布局的响应式设计StaticBoxSizer创建带边框的分组区域Notebook组件实现标签页切换
self.suggestions_list = wx.ListCtrl(panel,
style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
self.suggestions_list.AppendColumn("文件名", width=250)
self.suggestions_list.AppendColumn("类型", width=80)
self.suggestions_list.AppendColumn("使用频率", width=100)
self.suggestions_list.AppendColumn("建议操作", width=150)
self.suggestions_list.AppendColumn("原因", width=250)
ListCtrl 风格说明:
wx.LC_REPORT:报告模式(多列列表)wx.LC_SINGLE_SEL:单选模式
def scan_desktop(self):
if not self.desktop_path.exists():
return
files = []
total_size = 0
try:
for item in self.desktop_path.iterdir():
# 跳过隐藏文件和整理目录
if item.name.startswith('.') or item.name == '桌面整理':
continue
# 获取文件元数据
stat = item.stat()
file_info = {
'path': str(item),
'name': item.name,
'is_dir': item.is_dir(),
'size': stat.st_size,
'created': stat.st_ctime,
'modified': stat.st_mtime,
'accessed': stat.st_atime
}
# 更新使用数据
file_key = str(item)
if file_key not in self.usage_data:
# 新文件:初始化记录
self.usage_data[file_key] = {
'access_count': 0,
'last_access': stat.st_atime,
'created': stat.st_ctime
}
else:
# 已存在:检测访问时间变化
if stat.st_atime > self.usage_data[file_key]['last_access']:
self.usage_data[file_key]['access_count'] += 1
self.usage_data[file_key]['last_access'] = stat.st_atime
files.append(file_info)
total_size += stat.st_size
except Exception as e:
wx.MessageBox(f"扫描失败: {str(e)}", "错误",
wx.OK | wx.ICON_ERROR)
return
# 保存数据并更新 UI
self.save_usage_data()
self.update_statistics(files, total_size)
self.generate_suggestions(files)
self.update_analysis(files)
关键技术点:
访问时间检测机制
if stat.st_atime > self.usage_data[file_key]['last_access']:
self.usage_data[file_key]['access_count'] += 1
通过比较文件系统的访问时间戳与上次记录,判断文件是否被使用过。
异常处理
- 使用
try-except捕获权限错误或 I/O 异常 - 通过
wx.MessageBox友好地展示错误信息
数据持久化
- 每次扫描后立即保存数据(
save_usage_data) - 避免程序崩溃导致数据丢失
def generate_suggestions(self, files):
self.suggestions_list.DeleteAllItems()
self.suggestions = []
now = time.time()
focus_threshold = self.focus_days.GetValue() * 86400 # 转换为秒
assist_threshold = self.assist_days.GetValue() * 86400
for file_info in files:
file_key = file_info['path']
usage = self.usage_data.get(file_key, {})
# 计算关键指标
last_access = usage.get('last_access', file_info['accessed'])
access_count = usage.get('access_count', 0)
days_since_access = (now - last_access) / 86400
# 决策逻辑
if days_since_access <= focus_threshold and access_count > 2:
suggestion = "保留在专注区"
reason = f"最近{int(days_since_access)}天使用过{access_count}次"
elif days_since_access <= assist_threshold and access_count > 0:
suggestion = "移至辅助区"
reason = f"{int(days_since_access)}天前使用,访问{access_count}次"
else:
suggestion = "移至临时区"
reason = f"已{int(days_since_access)}天未使用"
# 添加到界面
file_type = "文件夹" if file_info['is_dir'] else "文件"
freq = "高频" if access_count > 5 else
"中频" if access_count > 2 else "低频"
idx = self.suggestions_list.InsertItem(
self.suggestions_list.GetItemCount(),
file_info['name']
)
self.suggestions_list.SetItem(idx, 1, file_type)
self.suggestions_list.SetItem(idx, 2, freq)
self.suggestions_list.SetItem(idx, 3, suggestion)
self.suggestions_list.SetItem(idx, 4, reason)
算法设计思路:
决策树:
├─ 最近 7 天使用 且 访问次数 > 2 → 专注区(高频使用)
├─ 最近 30 天使用 且 访问次数 > 0 → 辅助区(中频使用)
└─ 其他 → 临时区(低频/未使用)
参数可调性:
- 通过
SpinCtrl组件,用户可以自定义天数阈值 - 访问次数阈值硬编码(2次、5次),可扩展为可配置项
def apply_organization(self):
try:
# 1. 创建目标目录
self.organize_root.mkdir(exist_ok=True)
self.focus_zone.mkdir(exist_ok=True)
self.assist_zone.mkdir(exist_ok=True)
self.temp_zone.mkdir(exist_ok=True)
operations = [] # 记录所有操作,用于撤销
for suggestion in self.suggestions:
file_info = suggestion['file_info']
action = suggestion['suggestion']
source = Path(file_info['path'])
if not source.exists():
continue
# 2. 确定目标目录
if "专注区" in action:
target_dir = self.focus_zone
elif "辅助区" in action:
target_dir = self.assist_zone
elif "临时区" in action:
target_dir = self.temp_zone
else:
continue
target = target_dir / source.name
# 3. 处理文件名冲突
counter = 1
while target.exists():
stem = source.stem
suffix = source.suffix
target = target_dir / f"{stem}_{counter}{suffix}"
counter += 1
# 4. 执行移动
try:
shutil.move(str(source), str(target))
operations.append({
'source': str(source),
'target': str(target)
})
except Exception as e:
print(f"移动失败: {source} -> {target}, 错误: {e}")
# 5. 保存撤销日志
if operations:
undo_file = self.organize_root / ".undo_log.json"
with open(undo_file, 'w', encoding='utf-8') as f:
json.dump(operations, f, ensure_ascii=False, indent=2)
self.undo_btn.Enable(True)
wx.MessageBox(f"整理完成!共处理 {len(operations)} 个项目",
"成功", wx.OK | wx.ICON_INFORMATION)
self.scan_desktop()
except Exception as e:
wx.MessageBox(f"整理失败: {str(e)}", "错误",
wx.OK | wx.ICON_ERROR)
技术亮点:
文件名冲突处理
while target.exists():
target = target_dir / f"{stem}_{counter}{suffix}"
counter += 1
自动添加数字后缀(如 report_1.pdf, report_2.pdf)
操作日志设计
[
{
"source": "/Users/xxx/Desktop/file.txt",
"target": "/Users/xxx/Desktop/桌面整理/临时区/file.txt"
}
]
记录源路径和目标路径,为撤销操作提供数据支持
原子性操作
- 使用
shutil.move而非copy + delete - 确保移动操作的原子性
def on_undo(self, event):
undo_file = self.organize_root / ".undo_log.json"
if not undo_file.exists():
wx.MessageBox("没有可撤销的操作", "提示",
wx.OK | wx.ICON_INFORMATION)
return
try:
# 1. 读取操作日志
with open(undo_file, 'r', encoding='utf-8') as f:
operations = json.load(f)
# 2. 反向执行所有操作
for op in operations:
target = Path(op['target'])
source = Path(op['source'])
if target.exists():
shutil.move(str(target), str(source))
# 3. 删除日志并禁用撤销按钮
undo_file.unlink()
self.undo_btn.Enable(False)
wx.MessageBox("撤销成功!", "成功",
wx.OK | wx.ICON_INFORMATION)
self.scan_desktop()
except Exception as e:
wx.MessageBox(f"撤销失败: {str(e)}", "错误",
wx.OK | wx.ICON_ERROR)
撤销机制设计:
- 撤销操作是"整理操作"的完全逆向
- 将文件从整理目录移回原始桌面位置
- 撤销后删除日志文件,避免重复撤销
# 初始化定时器
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.on_timer, self.timer)
self.timer.Start(300000) # 每 5 分钟(300,000 毫秒)
def on_timer(self, event):
"""定时扫描"""
self.scan_desktop()
定时器机制:
- 每 5 分钟自动扫描桌面
- 静默更新使用数据(不弹窗提示)
- 用户无感知的后台数据采集
整理建议页面
文件名 类型 使用频率 建议操作 原因
project_report.pdf 文件 高频 保留在专注区 最近3天使用过8次
design.psd 文件 中频 移至辅助区 15天前使用,访问3次
wallpaper.jpg 文件 低频 移至临时区 已45天未使用
使用分析页面
文件名 访问次数 最后访问 创建时间 大小
project_report.pdf 15 2025-01-13 10:30 2024-12-20 09:00 2.3 MB
meeting_notes.docx 7 2025-01-10 14:15 2024-12-15 11:20 156 KB
screenshot.png 1 2024-11-28 16:40 2024-11-28 16:40 1.1 MB
整理前(混乱状态):
Desktop/
├── 项目文档.pdf
├── 临时截图1.png
├── 临时截图2.png
├── 会议记录.docx
├── 旧版设计稿.psd
├── 下载的表格.xlsx
└── … (30+ 个文件)
整理后(有序状态):
Desktop/
├── 桌面整理/
│ ├── 专注区/
│ │ ├── 项目文档.pdf
│ │ └── 会议记录.docx
│ ├── 辅助区/
│ │ ├── 旧版设计稿.psd
│ │ └── 下载的表格.xlsx
│ └── 临时区/
│ ├── 临时截图1.png
│ └── 临时截图2.png
└── (仅保留正在工作的文件)
假设运行一周后的数据:
{
"总扫描次数": 2016, // 每 5 分钟扫描一次
"追踪文件数": 47,
"平均访问频率": {
"专注区文件": 12.3,
"辅助区文件": 3.5,
"临时区文件": 0.2
},
"整理操作次数": 3,
"撤销次数": 1
}
以上就是Python结合wxPython开发一个智能桌面整理助手的详细内容,更多关于Python桌面整理的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- 基于Python开发的桌面级文件备份工具
- 使用Python开发一个桌面版PDF盖章工具
- Python结合PyQt和Flask实现桌面端一键启动/关闭Web服务的应用
- 基于Python实现局域网内Windows桌面文件传输
- Python编写一个Excel批量处理的桌面实用脚本
- 基于Python开发一个桌面便签工具