acdr/acdr-ui/tootls/文件处理工具.py

203 lines
8.5 KiB
Python

import os
import tkinter as tk
from tkinter import filedialog, scrolledtext, ttk
from tkinter import Menu
from PIL import Image
# 搜索指定关键字的函数
def search_keyword_in_files(directory, keyword, output_text):
if not keyword:
output_text.insert(tk.END, "请输入要搜索的关键字。\n")
return
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(('.js', '.json', '.vue', '.ts', '.py', '.java', '.cpp')):
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
count = content.count(keyword)
if count > 0:
output_text.insert(tk.END, f"{file_path} 中找到 '{keyword}',共 {count}\n")
except Exception as e:
output_text.insert(tk.END, f"读取文件 {file_path} 出错: {e}\n")
output_text.insert(tk.END, "搜索完成。\n")
# 找出不包含指定关键字的文件
def find_files_without_keyword(directory, keyword, output_text):
if not keyword:
output_text.insert(tk.END, "请输入要搜索的关键字。\n")
return
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(('.js', '.json', '.vue', '.ts', '.py', '.java', '.cpp')):
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
if keyword not in content:
output_text.insert(tk.END, f"'{keyword}' 未在文件 {file_path} 中找到。\n")
except Exception as e:
output_text.insert(tk.END, f"读取文件 {file_path} 出错: {e}\n")
output_text.insert(tk.END, "查找未包含关键字的文件完成。\n")
# 替换文件内容中的指定字符串
def replace_in_files(directory, search_text, replace_text, output_text):
if not search_text or not replace_text:
output_text.insert(tk.END, "请输入要替换的文本和新文本。\n")
return
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(('.js', '.json', '.vue', '.ts', '.py', '.java', '.cpp')):
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
if search_text in content:
new_content = content.replace(search_text, replace_text)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(new_content)
output_text.insert(tk.END, f"{file_path} 中替换 '{search_text}''{replace_text}'\n")
except Exception as e:
output_text.insert(tk.END, f"处理文件 {file_path} 时出错: {e}\n")
output_text.insert(tk.END, "替换完成。\n")
# 转换指定颜色为透明色的功能
def convert_color_to_transparent(image_path, color, output_text):
img = Image.open(image_path)
img = img.convert("RGBA")
datas = img.getdata()
newData = []
for item in datas:
if item[0:3] == color:
newData.append((255, 255, 255, 0)) # 将指定颜色变为透明
else:
newData.append(item)
img.putdata(newData)
new_path = os.path.splitext(image_path)[0] + "_transparent.png"
img.save(new_path)
output_text.insert(tk.END, f"处理后的图片保存为 '{new_path}'\n")
# 清空输出框的函数
def clear_output(output_text):
output_text.delete(1.0, tk.END)
# 添加右键菜单
def add_right_click_menu(output_text):
menu = Menu(output_text, tearoff=0)
menu.add_command(label="清空输出", command=lambda: clear_output(output_text))
def show_menu(event):
menu.post(event.x_root, event.y_root)
output_text.bind("<Button-3>", show_menu)
# 创建GUI界面
def create_gui():
root = tk.Tk()
root.title("文件和图片处理工具")
root.geometry("800x500")
notebook = ttk.Notebook(root)
notebook.pack(fill='both', expand=True)
search_frame = ttk.Frame(notebook)
notebook.add(search_frame, text="搜索和替换")
image_frame = ttk.Frame(notebook)
notebook.add(image_frame, text="图片透明化")
note_frame = ttk.Frame(notebook)
notebook.add(note_frame, text="记事本")
# 搜索和替换界面
left_frame_search = ttk.Frame(search_frame)
left_frame_search.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)
keyword_entry = ttk.Entry(left_frame_search)
keyword_entry.pack(pady=5)
ttk.Label(left_frame_search, text="请输入要搜索的关键字:").pack(pady=5)
search_button = ttk.Button(left_frame_search, text="搜索文件夹",
command=lambda: browse_directory_for_search(keyword_entry.get(), output_text_search))
search_button.pack(pady=5)
search_text_entry = ttk.Entry(left_frame_search)
search_text_entry.pack(pady=5)
ttk.Label(left_frame_search, text="请输入要替换的文本:").pack(pady=5)
replace_text_entry = ttk.Entry(left_frame_search)
replace_text_entry.pack(pady=5)
ttk.Label(left_frame_search, text="请输入新文本:").pack(pady=5)
replace_button = ttk.Button(left_frame_search, text="替换文件夹中的内容",
command=lambda: browse_directory_for_replace(search_text_entry.get(), replace_text_entry.get(), output_text_search))
replace_button.pack(pady=5)
search_missing_button = ttk.Button(left_frame_search, text="查找不包含关键字的文件",
command=lambda: browse_directory_for_missing(keyword_entry.get(), output_text_search))
search_missing_button.pack(pady=5)
output_text_search = scrolledtext.ScrolledText(search_frame, width=70)
output_text_search.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
add_right_click_menu(output_text_search) # 为搜索输出框添加右键菜单
# 图像透明化界面
color_entry = ttk.Entry(image_frame)
color_entry.pack(pady=5)
ttk.Label(image_frame, text="请输入要透明化的颜色 (r,g,b):").pack(pady=5)
trans_button = ttk.Button(image_frame, text="使图片透明",
command=lambda: browse_image_for_transparency(tuple(map(int, color_entry.get().split(','))), output_text_image))
trans_button.pack(pady=5)
output_text_image = scrolledtext.ScrolledText(image_frame, width=70)
output_text_image.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
add_right_click_menu(output_text_image) # 为图片处理输出框添加右键菜单
# 记事本界面
note_text = scrolledtext.ScrolledText(note_frame, width=70)
note_text.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
save_button = ttk.Button(note_frame, text="保存记事本", command=lambda: save_notes(note_text))
save_button.pack(pady=10)
root.mainloop()
# 辅助函数
def browse_directory_for_search(keyword, output_text):
directory = filedialog.askdirectory()
if directory:
output_text.insert(tk.END, f"正在 {directory} 中搜索关键字: '{keyword}'\n")
search_keyword_in_files(directory, keyword, output_text)
def browse_directory_for_replace(search_text, replace_text, output_text):
directory = filedialog.askdirectory()
if directory:
output_text.insert(tk.END, f"{directory} 中将 '{search_text}' 替换为 '{replace_text}'\n")
replace_in_files(directory, search_text, replace_text, output_text)
def browse_directory_for_missing(keyword, output_text):
directory = filedialog.askdirectory()
if directory:
output_text.insert(tk.END, f"正在 {directory} 中查找未包含关键字 '{keyword}' 的文件。\n")
find_files_without_keyword(directory, keyword, output_text)
def browse_image_for_transparency(color, output_text):
image_path = filedialog.askopenfilename()
if image_path:
convert_color_to_transparent(image_path, color, output_text)
def save_notes(note_text):
file_path = filedialog.asksaveasfilename(defaultextension=".txt")
if file_path:
with open(file_path, 'w') as file:
file.write(note_text.get(1.0, tk.END))
note_text.insert(tk.END, f"记事本已保存到 {file_path}\n")
if __name__ == "__main__":
create_gui()