from tkinter import * from tkinter import ttk from src.apps.dbapp.framebase import CustomFrameBase from src.database.weavservice import WeaviateService class QueryFrame(CustomFrameBase): def __init__(self, parent, service: WeaviateService) -> None: super().__init__(parent, service) def init(self) -> ttk.Frame: main_frame = ttk.Frame(self._parent) main_frame.pack(fill=BOTH, expand=True) input_frame = ttk.Frame(main_frame) input_frame.pack(fill=X, padx=10, pady=(5, 10)) self.language_var = StringVar(value="de") self.filters_button = ttk.Button(input_frame, text="Filters...", command=self.open_filters) self.filters_button.pack(side=LEFT, padx=(0, 10)) lang_frame = ttk.Frame(input_frame) lang_frame.pack(side=LEFT, padx=(0, 15)) ttk.Radiobutton( lang_frame, text="EN", variable=self.language_var, value="en" ).pack(side=LEFT, padx=(0, 8)) ttk.Radiobutton( lang_frame, text="DE", variable=self.language_var, value="de" ).pack(side=LEFT) self.query_entry = ttk.Entry(input_frame) self.query_entry.pack(side=LEFT, fill=X, expand=True, padx=(0, 10)) self.send_button = ttk.Button(input_frame, text="Send", command=self.send_query) self.send_button.pack(side=RIGHT) self.query_entry.bind("", lambda _: self.send_query()) results_frame = ttk.Frame(main_frame) results_frame.pack(fill=BOTH, expand=True, padx=10, pady=(10, 5)) self.results_text = Text(results_frame, wrap=WORD, font=("TkDefaultFont", 10)) y_scrollbar = ttk.Scrollbar(results_frame, orient=VERTICAL, command=self.results_text.yview) self.results_text.configure(yscrollcommand=y_scrollbar.set) self.results_text.pack(side=LEFT, fill=BOTH, expand=True) y_scrollbar.pack(side=RIGHT, fill=Y) self.results_text.config(state=NORMAL) self.results_text.insert(END, "Enter your query below and click Send (or press Enter) to see results.\n") self.results_text.config(state=DISABLED) return main_frame def send_query(self): query_text = self.query_entry.get().strip() if not query_text: return self.query_entry.delete(0, END) try: response, _ = self._service.query( lang=self.language_var.get(), query=query_text, ) result_str = ''.join([f""" ---------------------- Result {idx} ---------------------- SOURCE: {obj.properties['source']} INSERTION DATE: {obj.properties['date']} RELEVANT PROGRAMS: {', '.join(obj.properties['programs'])} CONTENT: {obj.properties['body']} VECTOR: {obj.vector} """ for idx, obj in enumerate(response.objects, start=1)]) result_str = f"Query: {query_text}\n{result_str}" self.display_result(result_str) except Exception as e: self.display_result(f"Error:\n{str(e)}") def display_result(self, result_text: str): self.results_text.config(state=NORMAL) self.results_text.delete(1.0, END) self.results_text.insert(END, result_text + "\n") self.results_text.config(state=DISABLED) self.results_text.see(1.0) def open_filters(self): dialog = Toplevel(self._parent) dialog.title("Query Filters") dialog.geometry("400x300") dialog.grab_set()