import os import threading import itertools from tkinter import Tk, Label, Entry, Button, Text, filedialog from dotenv import load_dotenv from openai import OpenAI load_dotenv() def list_files(directory): files = [] for root, dirs, filenames in os.walk(directory): # Versteckte Verzeichnisse ausschließen dirs[:] = [d for d in dirs if not d.startswith('.')] for filename in filenames: if filename.endswith(('.docx', '.pdf')): file_path = os.path.join(root, filename) files.append(file_path) return files # Hier wurde die Einrückung korrigiert def compare_with_openai(content, search_query): client = OpenAI( api_key=os.environ.get("OPENAI_API_KEY"), # This is the default and can be omitted ) try: chat_completion = client.chat.completions.create( messages=[ { "role": "user", "content": f"Vergleiche den folgenden Text mit der Suchanfrage '{search_query}':\n\n{content[:1000]}...\n\nIst der Text relevant für die Suchanfrage? Antworte mit 'Ja' oder 'Nein'.", } ], model="gpt-4o-mini", ) answer = chat_completion.choices[0].message.content.strip().lower() return "ja" in answer except Exception as e: print(f"Fehler bei der OpenAI-API-Anfrage: {e}") return False def read_file_content(file_path): if file_path.endswith('.docx'): try: import docx doc = docx.Document(file_path) fullText = [] for para in doc.paragraphs: fullText.append(para.text) return '\n'.join(fullText) except Exception as e: print(f"Fehler beim Lesen der DOCX-Datei {file_path}: {e}") return '' elif file_path.endswith('.pdf'): try: import PyPDF2 with open(file_path, 'rb') as pdf_file: reader = PyPDF2.PdfReader(pdf_file) text = '' for page in reader.pages: page_text = page.extract_text() if page_text: text += page_text return text except Exception as e: print(f"Fehler beim Lesen der PDF-Datei {file_path}: {e}") return '' else: return '' def search_files_threaded(): search_query = query_entry.get() directory = directory_entry.get() if not search_query: print("Keine Suchanfrage eingegeben.") root.after(0, stop_animation) return if not directory: print("Kein Verzeichnis eingegeben.") root.after(0, stop_animation) return if not os.path.exists(directory): print("Verzeichnis existiert nicht.") root.after(0, stop_animation) return files = list_files(directory) found_files = [] for file_path in files: file_content = read_file_content(file_path) if file_content: if compare_with_openai(file_content, search_query): found_files.append(file_path) # Nach Abschluss der Suche GUI aktualisieren root.after(0, update_result_text, found_files) def update_result_text(found_files): # Animation stoppen global searching searching = False animation_label.config(text="") result_text.delete(1.0, 'end') if found_files: result_text.insert('end', "Dateien relevant für die Suchanfrage:\n") for file in found_files: result_text.insert('end', file + '\n') else: result_text.insert('end', "Keine relevanten Dateien gefunden.") def start_search(): global searching if searching: print("Die Suche läuft bereits.") return searching = True result_text.delete(1.0, 'end') # Ausgabefenster leeren animate() # Animation starten threading.Thread(target=search_files_threaded).start() def animate(): if not searching: return next_frame = next(animation_frames) animation_label.config(text=f"Suche läuft... {next_frame}") root.after(200, animate) def stop_animation(): global searching searching = False animation_label.config(text="") def select_directory(): directory = filedialog.askdirectory() if directory: directory_entry.delete(0, 'end') directory_entry.insert(0, directory) # GUI erstellen root = Tk() root.title("Dateisuche mit OpenAI") root.geometry("600x500") # Eingabefeld für die Suchanfrage query_label = Label(root, text="Suchanfrage:") query_label.pack(pady=5) query_entry = Entry(root, width=50) query_entry.pack(pady=5) # Eingabefeld für das Verzeichnis directory_label = Label(root, text="Verzeichnis:") directory_label.pack(pady=5) directory_entry = Entry(root, width=50) directory_entry.pack(pady=5) # Button zum Auswählen des Verzeichnisses select_button = Button(root, text="Durchsuchen...", command=select_directory) select_button.pack(pady=5) # Suchbutton search_button = Button(root, text="Suchen", command=start_search) search_button.pack(pady=10) # Animation Label animation_label = Label(root, text="") animation_label.pack(pady=5) # Ergebnisanzeige result_text = Text(root, height=15, width=70) result_text.pack(pady=10) # Animation initialisieren animation_frames = itertools.cycle(['|', '/', '-', '\\']) searching = False root.mainloop()