can you convert it to another gui as qpy5 or somehing, but not tiker?: import tkinter as tk
from tkinter import ttk, scrolledtext
from threading import Thread, Lock
import re
import socket
import netifaces

lock = Lock()
def extract_ips(bridge_data):
    pattern = re.compile(r'(\d{1,3}(?:.\d{1,3}){3}:\d+)')
    ips_with_ports = pattern.findall(bridge_data)
    return ips_with_ports

def update_console(message):
    with lock:
        console_display.configure(state='normal')
        console_display.insert(tk.END, message + "\n")
        console_display.configure(state='disabled')
        console_display.yview(tk.END)

def is_port_open(ip, port, timeout):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(timeout)
    try:
        sock.connect((ip, port))
        return True
    except socket.error:
        return False
    finally:
        sock.close()

def check_ip_port(ip, port, timeout):
    if is_port_open(ip, port, timeout):
        update_console(f"Connection successful for {ip}:{port}")
        return True
    else:
        update_console(f"Connection failed for {ip}:{port}")
        return False

def check_bridges():
    raw_data = bridge_input.get('1.0', tk.END)
    ip_port_pairs = extract_ips(raw_data)
    timeout = float(timeout_entry.get())
    def process_ips():
        responsive_bridges = []
        for ip_port in ip_port_pairs:
            ip, port = ip_port.split(':')
            if check_ip_port(ip, int(port), timeout):
                responsive_bridges.append(ip_port)
        with lock:
            responsive_data = '\n'.join([line for line in raw_data.split('\n') if any(ip_port in line for ip_port in responsive_bridges)])
            result_display.configure(state='normal')
            result_display.delete('1.0', tk.END)
            result_display.insert(tk.END, responsive_data)
            result_display.configure(state='disabled')
            status_label.config(text="Check completed")
    for _ in range(int(thread_count_entry.get())):
        thread = Thread(target=process_ips)
        thread.start()

def get_network_interfaces():
    interfaces_list = netifaces.interfaces()
    return interfaces_list

def clear_console():
    console_display.configure(state='normal')
    console_display.delete('1.0', tk.END)
    console_display.configure(state='disabled')

root = tk.Tk()
root.title("Tor Bridge Connectivity Checker")

frame = ttk.Frame(root, padding="3")
frame.grid(column=0, row=0, sticky=(tk.W, tk.E, tk.N, tk.S))
frame.columnconfigure(0, weight=1)

interfaces = get_network_interfaces()
net_interface_label = ttk.Label(frame, text="Network Interface:")
net_interface_label.grid(column=0, row=0, sticky=tk.W)
net_interface_selector = ttk.Combobox(frame, values=interfaces)
net_interface_selector.grid(column=1, row=0, sticky=(tk.W, tk.E), columnspan=3)

thread_count_label = ttk.Label(frame, text="Thread Count:")
thread_count_label.grid(column=4, row=0, sticky=tk.W, padx=(4, 0))
thread_count_entry = ttk.Spinbox(frame, from_=1, to=100, increment=1, width=7)
thread_count_entry.set(10)  # default value
thread_count_entry.grid(column=5, row=0)

timeout_label = ttk.Label(frame, text="Timeout (s):")
timeout_label.grid(column=6, row=0, sticky=tk.W, padx=(4, 0))
timeout_entry = ttk.Spinbox(frame, from_=1, to=10, increment=0.5, width=7, format="%.1f")
timeout_entry.set(3.0)  # default value
timeout_entry.grid(column=7, row=0)

bridge_label = ttk.Label(frame, text="Bridges to Check:")
bridge_label.grid(column=0, row=1, sticky=tk.W)
bridge_input = scrolledtext.ScrolledText(frame, height=10)
bridge_input.grid(column=0, row=2, columnspan=8, sticky=(tk.W, tk.E), pady=(0, 5))
paste_button = tk.Button(frame, text="Paste", command=lambda: bridge_input.event_generate('<<Paste>>'))
paste_button.grid(column=0, row=3, sticky=tk.W)

result_label = ttk.Label(frame, text="Sorted List:")
result_label.grid(column=0, row=4, sticky=tk.W)
result_display = scrolledtext.ScrolledText(frame, height=10, state='disabled')
result_display.grid(column=0, row=5, columnspan=8, sticky=(tk.W, tk.E), pady=(0, 5))
select_all_button = tk.Button(frame, text="Select All", command=lambda: result_display.tag_add(tk.SEL, "1.0", tk.END))
select_all_button.grid(column=0, row=6, sticky=tk.W)
copy_button = tk.Button(frame, text="Copy", command=lambda: root.clipboard_append(result_display.get(tk.SEL_FIRST, tk.SEL_LAST)))
copy_button.grid(column=1, row=6, sticky=tk.W)

check_button = tk.Button(frame, text="Check Bridges", command=check_bridges)
check_button.grid(column=2, row=6, sticky=tk.W, pady=(0, 5))

console_label = ttk.Label(frame, text="Console Log:")
console_label.grid(column=0, row=7, sticky=tk.W)
clear_console_button = tk.Button(frame, text="Clear", command=clear_console)
clear_console_button.grid(column=0, row=8, sticky=tk.W)
console_display = scrolledtext.ScrolledText(frame, height=8, state='disabled', background='black', foreground='white')
console_display.grid(column=0, row=9, columnspan=8, sticky=(tk.W, tk.E))

status_label = tk.Label(frame, bd=1, relief=tk.SUNKEN, anchor=tk.W)
status_label.grid(column=0, row=10, columnspan=8, sticky=(tk.W, tk.E))

root.mainloop()