I have Python code that includes a Tkinter GUI and several asynchronous functions. However, when I run the code, only either the GUI or the functions are running. In this case the GUI starts first, and the functions only run after the window is closed. Here is the code segment:
# Workers ########################################################################################################
async def process_orders():
    last_incomplete_orders = []
    while True:
        # Logic for order processing here
        #print(colored("Processing orders...")
        # Get orders that haven't been fulfilled yet
        incomplete_orders = await get_incomplete_orders()
        
        if incomplete_orders != last_incomplete_orders:
            incomplete_order_ids = []
            for payment in incomplete_orders:
                ID, Name, Progress = payment
                incomplete_order_ids.append(ID)
            #print(colored(f'{datetime.datetime.now().strftime("%H:%M:%S")} - IDs of incomplete orders: {str(incomplete_order_ids)[1:-1]}', 'magenta', 'on_white'))
            last_incomplete_orders = incomplete_orders
            
        await asyncio.sleep(5)
async def process_payments():
    last_unconfirmed_payments = []
    while True:
        # Payment processing
        #print(colored("Processing payments...")
        # Get payments that haven't been confirmed yet
        unconfirmed_payments = await get_pending_payment_requests()
        if unconfirmed_payments != last_unconfirmed_payments:
            printpaymentids = []
            for payment in unconfirmed_payments:
                payment_id, client_id, btc_adress, amt_btc, amt_eur, status = payment
                printpaymentids.append(payment_id)
            #print(colored(f'{datetime.datetime.now().strftime("%H:%M:%S")} - IDs of unpaid payment requests: {str(printpaymentids)[1:-1]}', 'magenta', 'on_cyan'))
            last_unconfirmed_payments = unconfirmed_payments
        for payment in unconfirmed_payments:
            payment_id, client_id, btc_adress, amt_btc, amt_eur, status = payment
            is_confirmed = False 
            is_confirmed = await is_payment_confirmed(payment_id)
            if is_confirmed:
                await release_order(payment_id) 
        await asyncio.sleep(2)  
async def main():
    await clear_all_tables()
    await asyncio.sleep(5)
    task1 = asyncio.create_task(process_orders())
    task2 = asyncio.create_task(process_payments())
    task3 = asyncio.create_task(funfunc())
    task4 = asyncio.create_task(run_gui())
    #task5 = asyncio.create_task(test_product_flow())
    #task6 = asyncio.create_task(test_product_flow())
    #task7 = asyncio.create_task(test_product_flow())
    #task8 = asyncio.create_task(test_product_flow())
    #task9 = asyncio.create_task(test_product_flow())
    #task10 = asyncio.create_task(test_product_flow())
    # Wait for all tasks to complete
    await asyncio.gather(task1, task2, task3, task4)#, task5, task6, task7, task8, task9, task10)
async def funfunc():
    await asyncio.sleep(90)
    messagebox.showinfo('Daily Report', str(await sum_daily_income()))
    
async def run_gui():
    # Create the application window
    window = c.CTk()
    window.title("Simple GUI")
    window.geometry("300x200")
    # Create a label
    label = c.CTkLabel(window, text="Hello, World!")
    label.pack()
    # Create a button
    button = c.CTkButton(window, text="Click me!", command=on_button_click)
    button.pack()
    window.mainloop()
async def create_test_customer():
    await asyncio.sleep(random.randint(1,30))
    await create_client(random.randint(100000,999999), ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(8)))
async def test_product_flow():
    # Create Order
    await asyncio.sleep(random.randint(0,30))
    order_id = await create_order(''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(50)), 100, 'test')
    
    # Create PaymentRequest
    payment_id = await create_payment_request(order_id, 1, 'testbtcadress1827635t123', random.randint(50,1000))
    
    # Confirm or Reject PaymentRequest
    await asyncio.sleep(random.randint(0,30))
    if random.randint(0,1) == 1:
        await confirm_payment(payment_id)
        await asyncio.sleep(random.randint(0,30))
        # Fulfill Order
        await simulate_fulfilled_order(order_id)
    else:
        await reject_payment(payment_id)
        
loop = asyncio.run(main())
I tried making the GUI as a class and the async functions as class methods but still wouldn't work for me.
UPDATE: I managed to solve it using the threading library and creating a seperate Thread for the GUI and for the Asynchronous functions. Thanks for the help guys!
