acdr/acdr-ui/tootls/scanfile.py
2024-09-05 14:05:15 +08:00

142 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import tkinter as tk
from tkinter import filedialog, scrolledtext, ttk
# 搜索指定关键字的函数
def search_keyword_in_files(directory, keyword, output_text):
if not keyword:
output_text.insert(tk.END, "Please provide a keyword to search.\n")
return
# 递归遍历目录中的所有文件
for root, dirs, files in os.walk(directory):
for file in files:
# 只检查 .js, .json, .vue, .ts 等相关文件
if file.endswith(('.js', '.json', '.vue', '.ts')):
file_path = os.path.join(root, file)
try:
# 打开文件并检查是否包含指定的关键字
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
if keyword in content:
output_text.insert(tk.END, f"Found '{keyword}' in: {file_path}\n")
except Exception as e:
output_text.insert(tk.END, f"Error reading file {file_path}: {e}\n")
output_text.insert(tk.END, "Search completed.\n")
# 浏览文件夹并执行搜索
def browse_directory_for_search(keyword_entry, output_text):
directory = filedialog.askdirectory()
if directory:
keyword = keyword_entry.get()
output_text.insert(tk.END, f"Searching in directory: {directory} for keyword: '{keyword}'\n")
search_keyword_in_files(directory, keyword, output_text)
# 清空日志窗口
def clear_output(output_text):
output_text.delete(1.0, tk.END)
# 替换文件内容中的指定字符串
def replace_in_files(directory, search_text, replace_text, output_text):
if not search_text or not replace_text:
output_text.insert(tk.END, "Please provide both search and replace text.\n")
return
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(('.js', '.json', '.vue', '.ts')):
file_path = os.path.join(root, file)
try:
# 打开文件并读取内容
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 如果找到了 search_text进行替换
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"Replaced in: {file_path}\n")
except Exception as e:
output_text.insert(tk.END, f"Error processing file {file_path}: {e}\n")
output_text.insert(tk.END, "Replacement completed.\n")
# 浏览文件夹并执行替换
def browse_directory_for_replace(search_entry, replace_entry, output_text):
directory = filedialog.askdirectory()
if directory:
search_text = search_entry.get()
replace_text = replace_entry.get()
output_text.insert(tk.END, f"Replacing in directory: {directory}\n")
output_text.insert(tk.END, f"Replacing '{search_text}' with '{replace_text}'\n")
replace_in_files(directory, search_text, replace_text, output_text)
# 创建主窗口
def create_gui():
root = tk.Tk()
root.title("File Text Search and Replace Tool")
root.geometry("800x500")
# 创建选项卡
notebook = ttk.Notebook(root)
notebook.pack(fill='both', expand=True)
# 第一个选项卡:关键字搜索
search_frame = ttk.Frame(notebook)
notebook.add(search_frame, text="Search")
# 第二个选项卡:替换内容
replace_frame = ttk.Frame(notebook)
notebook.add(replace_frame, text="Replace")
# 搜索功能:左侧面板,用于输入关键字和查找文件
left_frame_search = ttk.Frame(search_frame, width=200)
left_frame_search.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)
keyword_label = ttk.Label(left_frame_search, text="Keyword to Search:")
keyword_label.pack(pady=5)
keyword_entry = ttk.Entry(left_frame_search, width=30)
keyword_entry.pack(pady=5)
browse_button_search = ttk.Button(left_frame_search, text="Browse Directory", command=lambda: browse_directory_for_search(keyword_entry, output_text_search))
browse_button_search.pack(pady=10)
clear_button_search = ttk.Button(left_frame_search, text="Clear Output", command=lambda: clear_output(output_text_search))
clear_button_search.pack(pady=5)
output_text_search = scrolledtext.ScrolledText(search_frame, width=70, height=25)
output_text_search.pack(side=tk.RIGHT, padx=10, pady=10, fill=tk.BOTH, expand=True)
# 替换功能:左侧面板,提供替换功能
left_frame_replace = ttk.Frame(replace_frame, width=200)
left_frame_replace.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)
search_label = ttk.Label(left_frame_replace, text="Text to Search:")
search_label.pack(pady=5)
search_entry = ttk.Entry(left_frame_replace, width=30)
search_entry.pack(pady=5)
replace_label = ttk.Label(left_frame_replace, text="Text to Replace:")
replace_label.pack(pady=5)
replace_entry = ttk.Entry(left_frame_replace, width=30)
replace_entry.pack(pady=5)
browse_button_replace = ttk.Button(left_frame_replace, text="Browse Directory", command=lambda: browse_directory_for_replace(search_entry, replace_entry, output_text_replace))
browse_button_replace.pack(pady=10)
clear_button_replace = ttk.Button(left_frame_replace, text="Clear Output", command=lambda: clear_output(output_text_replace))
clear_button_replace.pack(pady=5)
output_text_replace = scrolledtext.ScrolledText(replace_frame, width=70, height=25)
output_text_replace.pack(side=tk.RIGHT, padx=10, pady=10, fill=tk.BOTH, expand=True)
root.mainloop()
if __name__ == "__main__":
create_gui()