From f4aee1b9a20825060cffd5845b3a4092c8bfcc69 Mon Sep 17 00:00:00 2001 From: tsjykj <114121999@qq.com> Date: Mon, 21 Jul 2025 09:48:22 +0800 Subject: [PATCH] 20270721 --- .idea/.gitignore | 8 + .idea/deployment.xml | 14 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/pythonProject1.iml | 10 + .idea/vcs.xml | 6 + main.py | 688 ++++++++++++++++++ 8 files changed, 747 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/deployment.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/pythonProject1.iml create mode 100644 .idea/vcs.xml create mode 100644 main.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/deployment.xml b/.idea/deployment.xml new file mode 100644 index 0000000..3029b8a --- /dev/null +++ b/.idea/deployment.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..59c6242 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fdd8fdf --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/pythonProject1.iml b/.idea/pythonProject1.iml new file mode 100644 index 0000000..2c80e12 --- /dev/null +++ b/.idea/pythonProject1.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..09e6c3b --- /dev/null +++ b/main.py @@ -0,0 +1,688 @@ +import os +import PyPDF2 +import docx +import pandas as pd +import tkinter as tk +from tkinter import filedialog, messagebox +from tkinter import ttk +import threading +import time +import zipfile +import py7zr +import rarfile +import webbrowser + +# 全局变量用于控制搜索状态 +pause_flag = threading.Event() +stop_flag = threading.Event() + + +def search_pdf(file_path, keyword): + try: + with open(file_path, 'rb') as file: + reader = PyPDF2.PdfReader(file) + matches = [] + for page_num, page in enumerate(reader.pages, start=1): + text = page.extract_text() + if keyword in text: + matches.append({'page': page_num, 'value': text}) + return matches + except Exception as e: + print(f"Error reading PDF {file_path}: {e}") + return [] + + +def search_word(file_path, keyword): + try: + doc = docx.Document(file_path) + matches = [] + # 遍历段落 + for para_num, para in enumerate(doc.paragraphs, start=1): + if keyword in para.text: + matches.append({'paragraph': para_num, 'value': para.text}) + # 遍历表格 + for table_num, table in enumerate(doc.tables, start=1): + for row_num, row in enumerate(table.rows, start=1): + for cell_num, cell in enumerate(row.cells, start=1): + if keyword in cell.text: + matches.append({ + 'table': table_num, + 'row': row_num, + 'cell': cell_num, + 'value': cell.text + }) + return matches + except Exception as e: + print(f"Error reading Word {file_path}: {e}") + return [] + + +def search_excel(file_path, keyword): + try: + # 根据文件扩展名选择合适的引擎 + if file_path.lower().endswith('.xls'): + engine = 'xlrd' + else: + engine = 'openpyxl' + excel_file = pd.ExcelFile(file_path, engine=engine) + sheet_names = excel_file.sheet_names + matches = [] + for sheet_name in sheet_names: + df = excel_file.parse(sheet_name) + for index, row in df.iterrows(): + for col, value in row.items(): + if pd.notna(value): + value_str = str(value) + if keyword in value_str: + matches.append({ + 'sheet': sheet_name, + 'row': index + 1, + 'column': col, + 'value': value_str + }) + return matches + except Exception as e: + print(f"Error reading Excel {file_path}: {e}") + return [] + + +# 添加文本文件搜索函数(适用于TXT、PHP、JS、HTML) +def search_text(file_path, keyword): + try: + with open(file_path, 'r', encoding='utf-8', errors='ignore') as file: + matches = [] + for line_num, line in enumerate(file, start=1): + if keyword in line: + matches.append({'line': line_num, 'value': line.strip()}) + return matches + except Exception as e: + print(f"Error reading text file {file_path}: {e}") + return [] + + +def search_zip(zip_path, keyword): + try: + with zipfile.ZipFile(zip_path, 'r') as zip_ref: + matches = [] + for file_info in zip_ref.infolist(): + if stop_flag.is_set(): + break + while pause_flag.is_set(): + time.sleep(0.1) + file_name = file_info.filename + # 添加对新文件类型的支持 + if file_name.lower().endswith(('.pdf', '.docx', '.xlsx', '.xls', '.txt', '.php', '.js', '.html')): + with zip_ref.open(file_name) as file: + temp_file_path = f"temp_{file_name}" + with open(temp_file_path, 'wb') as temp_file: + temp_file.write(file.read()) + if file_name.lower().endswith('.pdf'): + file_matches = search_pdf(temp_file_path, keyword) + elif file_name.lower().endswith('.docx'): + file_matches = search_word(temp_file_path, keyword) + elif file_name.lower().endswith(('.xlsx', '.xls')): + file_matches = search_excel(temp_file_path, keyword) + elif file_name.lower().endswith(('.txt', '.php', '.js', '.html')): + file_matches = search_text(temp_file_path, keyword) + if file_matches: + matches.append((file_name, file_matches)) + os.remove(temp_file_path) + return matches + except Exception as e: + print(f"Error reading ZIP {zip_path}: {e}") + return [] + + +def search_7z(seven_zip_path, keyword): + try: + with py7zr.SevenZipFile(seven_zip_path, mode='r') as archive: + matches = [] + for file_info in archive.getnames(): + if stop_flag.is_set(): + break + while pause_flag.is_set(): + time.sleep(0.1) + # 添加对新文件类型的支持 + if file_info.lower().endswith(('.pdf', '.docx', '.xlsx', '.xls', '.txt', '.php', '.js', '.html')): + archive.extract(path='temp_extract', targets=[file_info]) + temp_file_path = os.path.join('temp_extract', file_info) + if file_info.lower().endswith('.pdf'): + file_matches = search_pdf(temp_file_path, keyword) + elif file_info.lower().endswith('.docx'): + file_matches = search_word(temp_file_path, keyword) + elif file_info.lower().endswith(('.xlsx', '.xls')): + file_matches = search_excel(temp_file_path, keyword) + elif file_info.lower().endswith(('.txt', '.php', '.js', '.html')): + file_matches = search_text(temp_file_path, keyword) + if file_matches: + matches.append((file_info, file_matches)) + os.remove(temp_file_path) + import shutil + shutil.rmtree('temp_extract', ignore_errors=True) + return matches + except Exception as e: + print(f"Error reading 7-Zip {seven_zip_path}: {e}") + return [] + + +def search_rar(rar_path, keyword): + try: + rar = rarfile.RarFile(rar_path) + matches = [] + for file_info in rar.infolist(): + if stop_flag.is_set(): + break + while pause_flag.is_set(): + time.sleep(0.1) + file_name = file_info.filename + # 添加对新文件类型的支持 + if file_name.lower().endswith(('.pdf', '.docx', '.xlsx', '.xls', '.txt', '.php', '.js', '.html')): + rar.extract(file_info, path='temp_extract') + temp_file_path = os.path.join('temp_extract', file_name) + if file_name.lower().endswith('.pdf'): + file_matches = search_pdf(temp_file_path, keyword) + elif file_name.lower().endswith('.docx'): + file_matches = search_word(temp_file_path, keyword) + elif file_name.lower().endswith(('.xlsx', '.xls')): + file_matches = search_excel(temp_file_path, keyword) + elif file_name.lower().endswith(('.txt', '.php', '.js', '.html')): + file_matches = search_text(temp_file_path, keyword) + if file_matches: + matches.append((file_name, file_matches)) + os.remove(temp_file_path) + import shutil + shutil.rmtree('temp_extract', ignore_errors=True) + return matches + except Exception as e: + print(f"Error reading RAR {rar_path}: {e}") + return [] + + +def search_folder(folder_path, keyword, progress_callback): + results = { + 'pdf': [], + 'word': [], + 'excel': [], + 'zip': [], + '7z': [], + 'rar': [], + 'txt': [], # 新增 + 'php': [], # 新增 + 'js': [], # 新增 + 'html': [] # 新增 + } + all_files = [] + for root, dirs, files in os.walk(folder_path): + for file in files: + # 添加对新文件类型的支持 + if file.lower().endswith(('.pdf', '.docx', '.xlsx', '.xls', '.zip', '.7z', '.rar', + '.txt', '.php', '.js', '.html')): + all_files.append(os.path.join(root, file)) + + total_files = len(all_files) + for i, file_path in enumerate(all_files): + if stop_flag.is_set(): + break + while pause_flag.is_set(): + time.sleep(0.1) + if file_path.lower().endswith('.pdf'): + matches = search_pdf(file_path, keyword) + if matches: + results['pdf'].append((file_path, matches)) + elif file_path.lower().endswith('.docx'): + matches = search_word(file_path, keyword) + if matches: + results['word'].append((file_path, matches)) + elif file_path.lower().endswith(('.xlsx', '.xls')): + matches = search_excel(file_path, keyword) + if matches: + results['excel'].append((file_path, matches)) + elif file_path.lower().endswith('.zip'): + matches = search_zip(file_path, keyword) + if matches: + results['zip'].append((file_path, matches)) + elif file_path.lower().endswith('.7z'): + matches = search_7z(file_path, keyword) + if matches: + results['7z'].append((file_path, matches)) + elif file_path.lower().endswith('.rar'): + matches = search_rar(file_path, keyword) + if matches: + results['rar'].append((file_path, matches)) + # 添加新文件类型的处理 + elif file_path.lower().endswith('.txt'): + matches = search_text(file_path, keyword) + if matches: + results['txt'].append((file_path, matches)) + elif file_path.lower().endswith('.php'): + matches = search_text(file_path, keyword) + if matches: + results['php'].append((file_path, matches)) + elif file_path.lower().endswith('.js'): + matches = search_text(file_path, keyword) + if matches: + results['js'].append((file_path, matches)) + elif file_path.lower().endswith('.html'): + matches = search_text(file_path, keyword) + if matches: + results['html'].append((file_path, matches)) + + progress = (i + 1) / total_files * 100 + progress_callback(progress) + + return results + + +def format_pdf_results(results, keyword): + formatted = [] + for file_path, matches in results: + formatted.append(f"【PDF搜索结果】") + formatted.append(f"📄 文件路径:{file_path}") + for i, match in enumerate(matches, start=1): + formatted.append( + f" 🔍 匹配{i}: {{'page': {match['page']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + formatted.append("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + return '\n'.join(formatted) + + +def format_word_results(results, keyword): + formatted = [] + for file_path, matches in results: + formatted.append(f"【Word搜索结果】") + formatted.append(f"📄 文件路径:{file_path}") + for i, match in enumerate(matches, start=1): + if 'paragraph' in match: + formatted.append( + f" 🔍 匹配{i}: {{'paragraph': {match['paragraph']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + elif 'table' in match: + formatted.append( + f" 🔍 匹配{i}: {{'table': {match['table']}, 'row': {match['row']}, 'cell': {match['cell']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + formatted.append("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + return '\n'.join(formatted) + + +def format_excel_results(results, keyword): + formatted = [] + for file_path, matches in results: + formatted.append(f"【Excel搜索结果】") + formatted.append(f"📄 文件路径:{file_path}") + for i, match in enumerate(matches, start=1): + formatted.append( + f" 🔍 匹配{i}: {{'sheet': '{match['sheet']}', 'row': {match['row']}, 'column': '{match['column']}', 'value': '{highlight_keyword(str(match['value']), keyword)}'}}") + formatted.append("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + return '\n'.join(formatted) + + +# 添加文本类文件的结果格式化函数 +def format_text_results(results, keyword, file_type): + formatted = [] + for file_path, matches in results: + formatted.append(f"【{file_type}搜索结果】") + formatted.append(f"📄 文件路径:{file_path}") + for i, match in enumerate(matches, start=1): + formatted.append( + f" 🔍 匹配{i}: {{'line': {match['line']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + formatted.append("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + return '\n'.join(formatted) + + +def format_zip_results(results, keyword): + formatted = [] + for zip_path, matches in results: + formatted.append(f"【ZIP搜索结果】") + formatted.append(f"📦 压缩包路径:{zip_path}") + for file_name, file_matches in matches: + formatted.append(f" 📄 压缩包内文件:{file_name}") + for i, match in enumerate(file_matches, start=1): + if 'page' in match: + formatted.append( + f" 🔍 匹配{i}: {{'page': {match['page']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + elif 'paragraph' in match: + formatted.append( + f" 🔍 匹配{i}: {{'paragraph': {match['paragraph']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + elif 'sheet' in match: + formatted.append( + f" 🔍 匹配{i}: {{'sheet': '{match['sheet']}', 'row': {match['row']}, 'column': '{match['column']}', 'value': '{highlight_keyword(str(match['value']), keyword)}'}}") + # 添加对文本类文件的支持 + elif 'line' in match: + formatted.append( + f" 🔍 匹配{i}: {{'line': {match['line']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + formatted.append("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + return '\n'.join(formatted) + + +def format_7z_results(results, keyword): + formatted = [] + for seven_zip_path, matches in results: + formatted.append(f"【7-Zip搜索结果】") + formatted.append(f"📦 压缩包路径:{seven_zip_path}") + for file_name, file_matches in matches: + formatted.append(f" 📄 压缩包内文件:{file_name}") + for i, match in enumerate(file_matches, start=1): + if 'page' in match: + formatted.append( + f" 🔍 匹配{i}: {{'page': {match['page']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + elif 'paragraph' in match: + formatted.append( + f" 🔍 匹配{i}: {{'paragraph': {match['paragraph']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + elif 'sheet' in match: + formatted.append( + f" 🔍 匹配{i}: {{'sheet': '{match['sheet']}', 'row': {match['row']}, 'column': '{match['column']}', 'value': '{highlight_keyword(str(match['value']), keyword)}'}}") + # 添加对文本类文件的支持 + elif 'line' in match: + formatted.append( + f" 🔍 匹配{i}: {{'line': {match['line']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + formatted.append("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + return '\n'.join(formatted) + + +def format_rar_results(results, keyword): + formatted = [] + for rar_path, matches in results: + formatted.append(f"【RAR搜索结果】") + formatted.append(f"📦 压缩包路径:{rar_path}") + for file_name, file_matches in matches: + formatted.append(f" 📄 压缩包内文件:{file_name}") + for i, match in enumerate(file_matches, start=1): + if 'page' in match: + formatted.append( + f" 🔍 匹配{i}: {{'page': {match['page']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + elif 'paragraph' in match: + formatted.append( + f" 🔍 匹配{i}: {{'paragraph': {match['paragraph']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + elif 'sheet' in match: + formatted.append( + f" 🔍 匹配{i}: {{'sheet': '{match['sheet']}', 'row': {match['row']}, 'column': '{match['column']}', 'value': '{highlight_keyword(str(match['value']), keyword)}'}}") + # 添加对文本类文件的支持 + elif 'line' in match: + formatted.append( + f" 🔍 匹配{i}: {{'line': {match['line']}, 'value': '{highlight_keyword(match['value'], keyword)}'}}") + formatted.append("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + return '\n'.join(formatted) + + +def highlight_keyword(text, keyword): + parts = text.split(keyword) + result = parts[0] + for part in parts[1:]: + result += f'{{{keyword}}}' + part + return result + + +def insert_highlighted_text(text_widget, text, keyword): + index = '1.0' + while True: + pos = text_widget.search(f'{{{keyword}}}', index, tk.END) + if not pos: + break + end_pos = f'{pos}+{len(keyword) + 2}c' + text_widget.insert(pos, keyword, 'highlight') + text_widget.delete(end_pos) + index = end_pos + + +def open_file(event): + widget = event.widget + index = widget.index(tk.CURRENT) + url = widget.tag_names(index)[0] + if url.startswith('http'): + webbrowser.open(url) + else: + os.startfile(url) + + +def select_folder(): + folder_path = filedialog.askdirectory() + folder_entry.delete(0, tk.END) + folder_entry.insert(0, folder_path) + + +def update_progress(progress): + progress_bar['value'] = progress + if progress == 100: + status_label.config(text="搜索完成") + root.update_idletasks() + + +def perform_search(): + global pause_flag, stop_flag + pause_flag.clear() + stop_flag.clear() + status_label.config(text="") + folder_path = folder_entry.get() + keyword = keyword_entry.get() + if not folder_path or not keyword: + messagebox.showerror("错误", "请输入文件夹路径和关键字。") + return + search_thread = threading.Thread(target=search_and_display, args=(folder_path, keyword)) + search_thread.start() + + +def search_and_display(folder_path, keyword): + all_results = search_folder(folder_path, keyword, update_progress) + pdf_results = format_pdf_results(all_results['pdf'], keyword) + word_results = format_word_results(all_results['word'], keyword) + excel_results = format_excel_results(all_results['excel'], keyword) + zip_results = format_zip_results(all_results['zip'], keyword) + seven_zip_results = format_7z_results(all_results['7z'], keyword) + rar_results = format_rar_results(all_results['rar'], keyword) + # 新增文本类文件结果处理 + txt_results = format_text_results(all_results['txt'], keyword, "TXT") + php_results = format_text_results(all_results['php'], keyword, "PHP") + js_results = format_text_results(all_results['js'], keyword, "JS") + html_results = format_text_results(all_results['html'], keyword, "HTML") + + # 更新原有标签页内容 + pdf_text.delete(1.0, tk.END) + pdf_text.insert(tk.END, pdf_results) + insert_highlighted_text(pdf_text, pdf_results, keyword) + for tag in pdf_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + pdf_text.tag_configure(tag, foreground='blue', underline=True) + pdf_text.tag_bind(tag, '', open_file) + + word_text.delete(1.0, tk.END) + word_text.insert(tk.END, word_results) + insert_highlighted_text(word_text, word_results, keyword) + for tag in word_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + word_text.tag_configure(tag, foreground='blue', underline=True) + word_text.tag_bind(tag, '', open_file) + + excel_text.delete(1.0, tk.END) + excel_text.insert(tk.END, excel_results) + insert_highlighted_text(excel_text, excel_results, keyword) + for tag in excel_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + excel_text.tag_configure(tag, foreground='blue', underline=True) + excel_text.tag_bind(tag, '', open_file) + + zip_text.delete(1.0, tk.END) + zip_text.insert(tk.END, zip_results) + insert_highlighted_text(zip_text, zip_results, keyword) + for tag in zip_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + zip_text.tag_configure(tag, foreground='blue', underline=True) + zip_text.tag_bind(tag, '', open_file) + + seven_zip_text.delete(1.0, tk.END) + seven_zip_text.insert(tk.END, seven_zip_results) + insert_highlighted_text(seven_zip_text, seven_zip_results, keyword) + for tag in seven_zip_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + seven_zip_text.tag_configure(tag, foreground='blue', underline=True) + seven_zip_text.tag_bind(tag, '', open_file) + + rar_text.delete(1.0, tk.END) + rar_text.insert(tk.END, rar_results) + insert_highlighted_text(rar_text, rar_results, keyword) + for tag in rar_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + rar_text.tag_configure(tag, foreground='blue', underline=True) + rar_text.tag_bind(tag, '', open_file) + + # 新增文本类文件标签页内容更新 + txt_text.delete(1.0, tk.END) + txt_text.insert(tk.END, txt_results) + insert_highlighted_text(txt_text, txt_results, keyword) + for tag in txt_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + txt_text.tag_configure(tag, foreground='blue', underline=True) + txt_text.tag_bind(tag, '', open_file) + + php_text.delete(1.0, tk.END) + php_text.insert(tk.END, php_results) + insert_highlighted_text(php_text, php_results, keyword) + for tag in php_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + php_text.tag_configure(tag, foreground='blue', underline=True) + php_text.tag_bind(tag, '', open_file) + + js_text.delete(1.0, tk.END) + js_text.insert(tk.END, js_results) + insert_highlighted_text(js_text, js_results, keyword) + for tag in js_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + js_text.tag_configure(tag, foreground='blue', underline=True) + js_text.tag_bind(tag, '', open_file) + + html_text.delete(1.0, tk.END) + html_text.insert(tk.END, html_results) + insert_highlighted_text(html_text, html_results, keyword) + for tag in html_text.tag_names(): + if tag.startswith('http') or os.path.exists(tag): + html_text.tag_configure(tag, foreground='blue', underline=True) + html_text.tag_bind(tag, '', open_file) + + +def pause_search(): + if pause_flag.is_set(): + pause_flag.clear() + pause_button.config(text="暂停") + else: + pause_flag.set() + pause_button.config(text="继续") + + +def stop_search(): + global stop_flag + stop_flag.set() + progress_bar['value'] = 0 + status_label.config(text="") + + +# 创建主窗口 +root = tk.Tk() +root.title("文件搜索工具") + +# 设置字体大小 +font_size = 14 + +# 文件夹选择部分 +folder_label = tk.Label(root, text="选择文件夹:", font=("Arial", font_size)) +folder_label.pack(pady=5) + +folder_entry = tk.Entry(root, width=50, font=("Arial", font_size)) +folder_entry.pack(pady=5) + +select_button = tk.Button(root, text="选择文件夹", command=select_folder, font=("Arial", font_size)) +select_button.pack(pady=5) + +# 关键字输入部分 +keyword_label = tk.Label(root, text="输入关键字:", font=("Arial", font_size)) +keyword_label.pack(pady=5) + +keyword_entry = tk.Entry(root, width=50, font=("Arial", font_size)) +keyword_entry.pack(pady=5) + +# 搜索、暂停和停止按钮部分 +button_frame = tk.Frame(root) +button_frame.pack(pady=5) + +search_button = tk.Button(button_frame, text="开始搜索", command=perform_search, font=("Arial", font_size)) +search_button.pack(side=tk.LEFT, padx=5) + +pause_button = tk.Button(button_frame, text="暂停", command=pause_search, font=("Arial", font_size)) +pause_button.pack(side=tk.LEFT, padx=5) + +stop_button = tk.Button(button_frame, text="停止", command=stop_search, font=("Arial", font_size)) +stop_button.pack(side=tk.LEFT, padx=5) + +# 进度条和状态标签 +progress_frame = tk.Frame(root) +progress_frame.pack(pady=10) + +progress_bar = ttk.Progressbar(progress_frame, orient="horizontal", length=300, mode="determinate") +progress_bar.pack(side=tk.LEFT) + +status_label = tk.Label(progress_frame, text="", font=("Arial", font_size)) +status_label.pack(side=tk.LEFT, padx=10) + +# 创建 Notebook 组件 +notebook = ttk.Notebook(root) +notebook.pack(pady=10, fill=tk.BOTH, expand=True) + +# 创建原有标签页 +word_tab = tk.Frame(notebook) +notebook.add(word_tab, text="Word 结果") +word_text = tk.Text(word_tab, width=60, height=20, font=("Arial", font_size)) +word_text.pack(pady=10, fill=tk.BOTH, expand=True) +word_text.tag_config('highlight', foreground='red') + +excel_tab = tk.Frame(notebook) +notebook.add(excel_tab, text="Excel 结果") +excel_text = tk.Text(excel_tab, width=60, height=20, font=("Arial", font_size)) +excel_text.pack(pady=10, fill=tk.BOTH, expand=True) +excel_text.tag_config('highlight', foreground='red') + +pdf_tab = tk.Frame(notebook) +notebook.add(pdf_tab, text="PDF 结果") +pdf_text = tk.Text(pdf_tab, width=60, height=20, font=("Arial", font_size)) +pdf_text.pack(pady=10, fill=tk.BOTH, expand=True) +pdf_text.tag_config('highlight', foreground='red') + +zip_tab = tk.Frame(notebook) +notebook.add(zip_tab, text="ZIP 结果") +zip_text = tk.Text(zip_tab, width=60, height=20, font=("Arial", font_size)) +zip_text.pack(pady=10, fill=tk.BOTH, expand=True) +zip_text.tag_config('highlight', foreground='red') + +seven_zip_tab = tk.Frame(notebook) +notebook.add(seven_zip_tab, text="7-Zip 结果") +seven_zip_text = tk.Text(seven_zip_tab, width=60, height=20, font=("Arial", font_size)) +seven_zip_text.pack(pady=10, fill=tk.BOTH, expand=True) +seven_zip_text.tag_config('highlight', foreground='red') + +rar_tab = tk.Frame(notebook) +notebook.add(rar_tab, text="RAR 结果") +rar_text = tk.Text(rar_tab, width=60, height=20, font=("Arial", font_size)) +rar_text.pack(pady=10, fill=tk.BOTH, expand=True) +rar_text.tag_config('highlight', foreground='red') + +# 添加新文件类型的标签页 +txt_tab = tk.Frame(notebook) +notebook.add(txt_tab, text="TXT 结果") +txt_text = tk.Text(txt_tab, width=60, height=20, font=("Arial", font_size)) +txt_text.pack(pady=10, fill=tk.BOTH, expand=True) +txt_text.tag_config('highlight', foreground='red') + +php_tab = tk.Frame(notebook) +notebook.add(php_tab, text="PHP 结果") +php_text = tk.Text(php_tab, width=60, height=20, font=("Arial", font_size)) +php_text.pack(pady=10, fill=tk.BOTH, expand=True) +php_text.tag_config('highlight', foreground='red') + +js_tab = tk.Frame(notebook) +notebook.add(js_tab, text="JS 结果") +js_text = tk.Text(js_tab, width=60, height=20, font=("Arial", font_size)) +js_text.pack(pady=10, fill=tk.BOTH, expand=True) +js_text.tag_config('highlight', foreground='red') + +html_tab = tk.Frame(notebook) +notebook.add(html_tab, text="HTML 结果") +html_text = tk.Text(html_tab, width=60, height=20, font=("Arial", font_size)) +html_text.pack(pady=10, fill=tk.BOTH, expand=True) +html_text.tag_config('highlight', foreground='red') + +# 运行主循环 +root.mainloop() \ No newline at end of file