在现代办公环境中,文件管理是每个打工人每天都要面对的挑战。无论是文档、表格、图片还是其他各类文件,随着数量的增加,管理起来变得越来越困难。今天,我们要分享一个超实用的工具,它能让你轻松搞定文件管理,让你的工作效率大幅提升!
小李的文件管理难题
小李是一名普通的打工人,每天都要处理大量的文件资料。他的工作涉及到多个项目,每个项目都有成百上千个文件,包括项目计划、会议记录、设计图纸、财务报表等等。文件数量庞大,而且分散在不同的文件夹中,查找起来非常困难。
每次领导需要某个文件时,小李都要花费大量的时间在电脑中翻找,有时候甚至找不到,这让他感到非常焦虑。而且,随着项目的推进,文件还在不断增加,管理难度也在不断加大。小李在我们的社区群里求助,希望能找到一个更好的文件管理方法。
开源资料管理软件EXE的出现
就在小李一筹莫展的时候,社区群里的一位大佬分享了一个开源的资料管理软件EXE。这个软件无需写代码,也不需要安装Python环境,普通用户也能轻松上手。小李决定尝试一下,看看这个软件是否真的能解决他的文件管理难题。
想要获取本文所需要的EXE软件及Python代码,可关注公众号后台回复051
软件功能介绍
这个开源的资料管理软件EXE功能强大,界面简洁,操作方便。以下是它的主要功能:
项目管理:可以轻松创建新项目,并为每个项目设置独立的文件存放位置。
文件分类:支持自定义文件夹,方便对文件进行分类管理。
快速搜索:强大的搜索功能,能快速找到所需的文件。
一键恢复默认:如果文件管理变得混乱,可以一键恢复到默认设置。
多平台支持:适用于Windows、Mac和Linux等多个操作系统。
小李的使用体验
小李安装并运行了这个软件后,发现它真的非常实用。他按照软件的指引,创建了各个项目的文件夹,并将相关的文件移动到对应的文件夹中。通过自定义文件夹功能,他将不同类型的文件进行了分类,使得文件管理变得更加有序。
当需要查找某个文件时,小李只需在搜索框中输入关键词,软件就能迅速找到相关的文件,并显示文件的路径。这大大节省了他查找文件的时间,提高了工作效率。而且,软件的一键恢复默认功能也让小李感到安心,不用担心文件管理混乱无法恢复。
Python代码
import os
import json
import tkinter as tk
from tkinter import ttk, simpledialog, filedialog, messagebox
from tkinter import Listbox, END
CONFIG_FILE = "config.json"
DEFAULT_PATH = "D:/工程项目"
FONT = ("楷体", 12)
class ProjectManagerApp:
def __init__(self, root):
self.root = root
self.root.title("项目资料快捷管理")
self.root.geometry("800x800")
self.root.minsize(600, 600)
self.root.option_add("*Font", FONT)
# 设置更现代的主题
style = ttk.Style()
style.theme_use('vista')
self.config_data = self.load_config()
self.create_widgets()
def load_config(self):
"""加载配置文件"""
if os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return {}
def save_config(self):
"""保存配置文件"""
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
json.dump(self.config_data, f, ensure_ascii=False, indent=4)
def create_widgets(self):
"""创建UI组件"""
main_frame = ttk.Frame(self.root, padding=(20, 20))
main_frame.pack(expand=True, fill=tk.BOTH)
# 新建项目按钮
self.btn_create_project = ttk.Button(main_frame, text="新建项目", command=self.create_project)
self.btn_create_project.pack(pady=10)
# 一键恢复默认按钮
self.btn_reset_all = ttk.Button(main_frame, text="一键恢复默认", command=self.reset_all_custom_folders)
self.btn_reset_all.pack(pady=10)
# 项目选择区域
frame_selection = ttk.Frame(main_frame)
frame_selection.pack(pady=5)
ttk.Label(frame_selection, text="选择项目:").pack(side=tk.LEFT)
self.project_var = tk.StringVar()
self.dropdown = ttk.Combobox(frame_selection, textvariable=self.project_var, state="readonly", width=30)
self.dropdown.pack(side=tk.LEFT, padx=5)
self.load_existing_projects()
# 按钮区域
self.frame_buttons = ttk.Frame(main_frame)
self.frame_buttons.pack(pady=10, expand=True, fill=tk.BOTH)
# 统一的按钮
self.all_buttons = []
for i in range(24):
btn = ttk.Button(self.frame_buttons, text=f"自定义{i + 1}", width=15)
btn.grid(row=i // 4, column=i % 4, padx=5, pady=5, sticky="nsew")
btn.bind("<Button-3>", lambda e, index=i: self.show_custom_menu(e, index))
btn.config(command=lambda i=i: self.choose_custom_folder(i))
self.all_buttons.append(btn)
# 配置网格布局
for i in range(6):
self.frame_buttons.grid_rowconfigure(i, weight=1)
for i in range(4):
self.frame_buttons.grid_columnconfigure(i, weight=1)
# 搜索区域
search_frame = ttk.Frame(main_frame)
search_frame.pack(pady=10, fill=tk.X)
self.entry_search = ttk.Entry(search_frame, width=40)
self.entry_search.pack(side=tk.LEFT, padx=5)
self.btn_search = ttk.Button(search_frame, text="搜索", command=self.search_file)
self.btn_search.pack(side=tk.LEFT)
# 搜索结果列表
self.list_results = Listbox(main_frame, width=80, height=10)
self.list_results.pack(pady=10, fill=tk.BOTH, expand=True)
self.list_results.bind("<Double-Button-1>", self.open_selected_file)
# 绑定事件
self.project_var.trace_add("write", lambda *args: self.update_buttons())
# 初始化上次项目
last_project = self.config_data.get("last_project", "")
if last_project and last_project in self.dropdown["values"]:
self.project_var.set(last_project)
self.update_buttons()
def create_project(self):
"""创建新项目"""
last_path = self.config_data.get("last_path", DEFAULT_PATH)
project_dir = filedialog.askdirectory(title="选择项目存放位置", initialdir=last_path)
if not project_dir:
return
project_name = simpledialog.askstring("新建项目", f"请输入项目名称:\n(存放路径: {project_dir})")
if not project_name:
return
self.config_data["last_path"] = project_dir
self.save_config()
project_path = os.path.join(project_dir, project_name)
if not os.path.exists(project_path):
os.makedirs(project_path)
self.config_data["last_project"] = project_name
self.save_config()
self.load_existing_projects()
self.project_var.set(project_name)
self.update_buttons()
messagebox.showinfo("成功", f"项目 {project_name} 创建成功!\n存放位置: {project_path}")
else:
messagebox.showerror("错误", "该项目已存在!")
def load_existing_projects(self):
"""加载已有项目列表"""
project_dir = self.config_data.get("last_path", DEFAULT_PATH)
if os.path.exists(project_dir):
projects = [d for d in os.listdir(project_dir) if os.path.isdir(os.path.join(project_dir, d))]
self.dropdown["values"] = projects
def update_buttons(self):
"""更新按钮状态"""
project_path = self.get_current_project_path()
if not project_path:
return
custom_folders = self.config_data.get("custom_folders", {})
current_project_custom = custom_folders.get(self.project_var.get(), [""] * 24)
for i in range(24):
path = current_project_custom[i]
if path:
self.all_buttons[i].config(
text=os.path.basename(path),
command=lambda p=path: os.startfile(p)
)
else:
self.all_buttons[i].config(
text=f"自定义{i + 1}",
command=lambda i=i: self.choose_custom_folder(i)
)
def search_file(self):
"""执行文件搜索"""
query = self.entry_search.get().strip()
self.list_results.delete(0, END)
if not query:
return
project_path = self.get_current_project_path()
if not project_path or not os.path.exists(project_path):
return
results = []
for root, _, files in os.walk(project_path):
for file in files:
if query.lower() in file.lower():
results.append((file, root))
if results:
for file, path in results:
self.list_results.insert(END, f"{file} - {path}")
else:
self.list_results.insert(END, "未找到匹配文件")
def open_selected_file(self, event):
"""打开选中文件"""
selection = self.list_results.curselection()
if selection:
selected = self.list_results.get(selection[0])
if " - " in selected:
file_part, path_part = selected.split(" - ", 1)
full_path = os.path.join(path_part, file_part)
if os.path.exists(full_path):
os.startfile(full_path)
else:
messagebox.showerror("错误", "文件路径不存在")
def show_custom_menu(self, event, index):
"""显示右键菜单"""
menu = tk.Menu(self.root, tearoff=0)
menu.add_command(label="重新指定", command=lambda: self.choose_custom_folder(index))
menu.add_command(label="恢复默认", command=lambda: self.reset_custom_folder(index))
menu.post(event.x_root, event.y_root)
def reset_custom_folder(self, index):
"""重置自定义文件夹"""
project_name = self.project_var.get()
if not project_name:
return
custom_folders = self.config_data.get("custom_folders", {})
if project_name in custom_folders:
custom_folders[project_name][index] = ""
self.config_data["custom_folders"] = custom_folders
self.save_config()
self.all_buttons[index].config(
text=f"自定义{index + 1}",
command=lambda i=index: self.choose_custom_folder(i)
)
def choose_custom_folder(self, index):
"""选择自定义文件夹"""
current_path = self.config_data.get("custom_folders", {}).get(self.project_var.get(), [""] * 24)[index]
if current_path:
os.startfile(current_path)
else:
folder_path = filedialog.askdirectory(title="选择自定义文件夹")
if folder_path:
self.save_custom_path(index, folder_path)
def save_custom_path(self, index, path):
"""保存自定义路径"""
project_name = self.project_var.get()
if not project_name:
return
custom_folders = self.config_data.get("custom_folders", {})
if project_name not in custom_folders:
custom_folders[project_name] = [""] * 24
custom_folders[project_name][index] = path
self.config_data["custom_folders"] = custom_folders
self.save_config()
self.all_buttons[index].config(
text=os.path.basename(path),
command=lambda: os.startfile(path)
)
def get_current_project_path(self):
"""获取当前项目路径"""
project_dir = self.config_data.get("last_path", DEFAULT_PATH)
project_name = self.project_var.get()
if project_name:
full_path = os.path.join(project_dir, project_name)
return full_path if os.path.exists(full_path) else None
return None
def reset_all_custom_folders(self):
"""一键恢复所有自定义文件夹"""
project_name = self.project_var.get()
if not project_name:
return
custom_folders = self.config_data.get("custom_folders", {})
if project_name in custom_folders:
custom_folders[project_name] = [""] * 24
self.config_data["custom_folders"] = custom_folders
self.save_config()
for i in range(24):
self.all_buttons[i].config(
text=f"自定义{i + 1}",
command=lambda i=i: self.choose_custom_folder(i)
)
if __name__ == "__main__":
root = tk.Tk()
app = ProjectManagerApp(root)
root.mainloop()
总结
通过使用这个开源的资料管理软件EXE,小李成功地解决了文件管理的难题。他的工作效率得到了显著提升,不再为找不到文件而烦恼。如果你也在为文件管理而头疼,不妨试试这个软件,相信它也能为你带来便利。
如果你对Python自动化办公感兴趣,或者在工作中遇到了其他技术难题,欢迎关注我们的微信公众号。我们将持续为你带来更多实用的技术分享,让你的工作更加高效!