```python
import sys
import requests
from bs4 import BeautifulSoup
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from threading import Thread

# Configuration
URLS = {
    "OLD": "https://www.unknowncheats.me/forum/tags/release.html",
    "APEX": "https://www.unknowncheats.me/forum/apex-legends/",
    "EFT": "https://www.unknowncheats.me/forum/escape-from-tarkov/",
    "GTA5": "https://www.unknowncheats.me/forum/grand-theft-auto-v/",
    "OVERWATCH": "https://www.unknowncheats.me/forum/overwatch/",
    "PALADINS": "https://www.unknowncheats.me/forum/paladins/",
    "PUBG": "https://www.unknowncheats.me/forum/pubg-releases/",
    "RUST": "https://www.unknowncheats.me/forum/rust/",
    "SOT": "https://www.unknowncheats.me/forum/sea-of-thieves/",
    "TF2": "https://www.unknowncheats.me/forum/team-fortress-2-a/",
    "VALORANT": "https://www.unknowncheats.me/forum/valorant/",
    "BATTLEBIT": "https://www.unknowncheats.me/forum/battlebit-remastered/",
    "GMOD": "https://www.unknowncheats.me/forum/garry-s-mod/",
    "COD": {
        "COD1": "https://www.unknowncheats.me/forum/call-of-duty-1-a/",
        "COD2": "https://www.unknowncheats.me/forum/call-of-duty-2-a/",
        "COD4MW": "https://www.unknowncheats.me/forum/call-of-duty-4-modern-warfare/",
        "COD5WaW": "https://www.unknowncheats.me/forum/call-of-duty-5-world-at-war/",
        "COD6MW2": "https://www.unknowncheats.me/forum/call-of-duty-6-modern-warfare-2-a/",
        "CODBO": "https://www.unknowncheats.me/forum/call-of-duty-black-ops/",
        "CODMW3": "https://www.unknowncheats.me/forum/call-of-duty-modern-warfare-3-a/",
        "CODBO2": "https://www.unknowncheats.me/forum/call-of-duty-black-ops-2-a/",
        "CODBO3": "https://www.unknowncheats.me/forum/call-of-duty-black-ops-3-a/",
        "CODGHOST": "https://www.unknowncheats.me/forum/call-of-duty-ghosts/",
        "CODAW": "https://www.unknowncheats.me/forum/call-of-duty-advanced-warfare/",
        "CODBO4": "https://www.unknowncheats.me/forum/call-of-duty-black-ops-4-a/",
        "COD:MW": "https://www.unknowncheats.me/forum/call-of-duty-modern-warfare/",
        "CODCW": "https://www.unknowncheats.me/forum/call-of-duty-black-ops-cold-war/",
        "CODVANG": "https://www.unknowncheats.me/forum/call-of-duty-vanguard/",
        "COD:MW2": "https://www.unknowncheats.me/forum/call-of-duty-modern-warfare-ii/",
        "COD:MW3": "https://www.unknowncheats.me/forum/call-of-duty-modern-warfare-iii/"
    },
    "CSTRIKE": {
        "CSS": "https://www.unknowncheats.me/forum/counterstrike-source/",
        "CS2": "https://www.unknowncheats.me/forum/counter-strike-2-releases/",
        "CS16": "https://www.unknowncheats.me/forum/counterstrike-1-5-1-6-and-mods/"
    },
    "PAYDAYS": {
        "PAYDAY2": "https://www.unknowncheats.me/forum/payday-2-a/",
        "PAYDAY3": "https://www.unknowncheats.me/forum/payday-3-a/"
    },
    "OTHERS": {
        "OTHER1": "https://www.unknowncheats.me/forum/other-fps-games/",
        "OTHER2": "https://www.unknowncheats.me/forum/other-fps-games/index2.html",
        "OTHER3": "https://www.unknowncheats.me/forum/other-fps-games/index3.html"
    }
}

HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/118.0.0.0 Safari/537.36'
}

class ConsoleRedirector:
    """Redirects stdout to a Tkinter Text widget."""
    def __init__(self, text_widget):
        self.text_widget = text_widget

    def write(self, message):
        # Avoid inserting empty messages
        if message.strip() == '':
            return
        self.text_widget.configure(state='normal')
        # Insert message and add a tag to make it clickable if it's a URL
        self.text_widget.insert(tk.END, message)
        self.text_widget.configure(state='disabled')
        self.text_widget.see(tk.END)

    def flush(self):
        pass  # Needed for compatibility with sys.stdout

class UCReleaseFinderApp:
    def __init__(self, root):
        self.root = root
        self.root.title("UC Release Finder")
        self.root.geometry("800x600")
        self.root.resizable(False, False)

        # Initialize releases list
        self.releases = []

        # Setup GUI elements
        self.setup_ui()

    def setup_ui(self):
        # Top frame for category and subcategory selection
        top_frame = ttk.Frame(self.root, padding="10")
        top_frame.pack(fill='x')

        # Category selection
        ttk.Label(top_frame, text="Game Category:").grid(row=0, column=0, sticky='w')
        self.category_var = tk.StringVar()
        self.category_combobox = ttk.Combobox(
            top_frame, textvariable=self.category_var, state='readonly',
            values=list(URLS.keys())
        )
        self.category_combobox.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
        self.category_combobox.bind("<<ComboboxSelected>>", self.update_subcategories)

        # Subcategory selection
        ttk.Label(top_frame, text="Subcategory:").grid(row=1, column=0, sticky='w')
        self.subcategory_var = tk.StringVar()
        self.subcategory_combobox = ttk.Combobox(
            top_frame, textvariable=self.subcategory_var, state='readonly',
            values=[]
        )
        self.subcategory_combobox.grid(row=1, column=1, padx=5, pady=5, sticky='ew')

        # Configure grid weights
        top_frame.columnconfigure(1, weight=1)

        # Action buttons
        button_frame = ttk.Frame(self.root, padding="10")
        button_frame.pack(fill='x')

        self.find_button = ttk.Button(button_frame, text="Find Releases", command=self.start_search)
        self.find_button.pack(side='left', padx=(0, 5))

        self.export_button = ttk.Button(button_frame, text="Export Results", command=self.export_results, state='disabled')
        self.export_button.pack(side='left')

        # Progress bar
        self.progress = ttk.Progressbar(self.root, mode='indeterminate')
        self.progress.pack(fill='x', padx=10, pady=(0,10))

        # Console output with scrollbar
        console_frame = ttk.Frame(self.root, padding="10")
        console_frame.pack(fill='both', expand=True)

        self.console_text = tk.Text(console_frame, wrap='word', state='disabled', height=20)
        self.console_text.pack(side='left', fill='both', expand=True)

        scrollbar = ttk.Scrollbar(console_frame, command=self.console_text.yview)
        scrollbar.pack(side='right', fill='y')
        self.console_text['yscrollcommand'] = scrollbar.set

        # Redirect stdout to console_text
        sys.stdout = ConsoleRedirector(self.console_text)

    def update_subcategories(self, event=None):
        selected_category = self.category_var.get()
        subcategories = []
        if isinstance(URLS.get(selected_category), dict):
            subcategories = list(URLS[selected_category].keys())
        self.subcategory_combobox['values'] = subcategories
        self.subcategory_var.set('')  # Clear selection

    def get_selected_url(self):
        category = self.category_var.get()
        subcategory = self.subcategory_var.get()
        if not category:
            messagebox.showwarning("Selection Error", "Please select a game category.")
            return None
        if subcategory and isinstance(URLS[category], dict):
            url = URLS[category].get(subcategory)
        else:
            url = URLS.get(category)
        return url

    def start_search(self):
        url = self.get_selected_url()
        if not url:
            return
        # Disable buttons during search
        self.find_button.config(state='disabled')
        self.export_button.config(state='disabled')
        # Clear previous results
        self.console_text.configure(state='normal')
        self.console_text.delete(1.0, tk.END)
        self.console_text.configure(state='disabled')
        # Reset releases list
        self.releases = []
        # Start progress bar
        self.progress.start()
        # Start search in a separate thread to keep UI responsive
        Thread(target=self.search_releases, args=(url,), daemon=True).start()

    def search_releases(self, url):
        try:
            print(f"Fetching data from: {url}\n")
            response = requests.get(url, headers=HEADERS, timeout=10)
            response.raise_for_status()
            soup = BeautifulSoup(response.text, 'html.parser')

            # Find all divs that potentially contain threads
            divs = soup.find_all('div')
            release_count = 0

            for div in divs:
                # Check if '[Release]' is in the div's text
                if '[Release]' in div.text:
                    # Find the <a> tag with id starting with 'thread_title_'
                    a_tag = div.find('a', id=lambda x: x and x.startswith('thread_title_'))
                    if a_tag:
                        title = a_tag.text.strip()
                        href = a_tag['href']
                        full_url = href if href.startswith('http') else f"https://www.unknowncheats.me{href}"
                        print(f"[Release] {title}\nURL: {full_url}\n")
                        release_count += 1
                        # Append to releases list
                        self.releases.append({'title': title, 'url': full_url})
            if release_count == 0:
                print("No releases found.\n")
            else:
                print(f"Total Releases Found: {release_count}\n")
        except requests.RequestException as e:
            print(f"Error fetching data: {e}\n")
        finally:
            # Stop progress bar and re-enable buttons
            self.progress.stop()
            self.find_button.config(state='normal')
            if self.releases:
                self.export_button.config(state='normal')

    def export_results(self):
        if not self.releases:
            messagebox.showinfo("No Data", "There are no releases to export.")
            return
        file_path = filedialog.asksaveasfilename(
            defaultextension=".txt",
            filetypes=[("Text files", "*.txt"), ("All files", "*.*")]
        )
        if file_path:
            try:
                with open(file_path, 'w', encoding='utf-8') as f:
                    for release in self.releases:
                        f.write(f"{release['title']}\t{release['url']}\n")
                messagebox.showinfo("Export Successful", f"Releases exported to {file_path}")
            except Exception as e:
                messagebox.showerror("Export Failed", f"An error occurred while exporting:\n{e}")

    def on_close(self):
        # Restore original stdout
        sys.stdout = sys.__stdout__
        self.root.destroy()

def main():
    root = tk.Tk()
    app = UCReleaseFinderApp(root)
    root.protocol("WM_DELETE_WINDOW", app.on_close)
    root.mainloop()

if __name__ == "__main__":
    main()
```
Улучши интерфейс кода, сделай его красивее, добавь разные эффекты, сделай все структурированно и профессионально