Устранение зависания tkinter из-за telethon

Рейтинг: 0Ответов: 2Опубликовано: 25.05.2023

Пытаюсь написать приложение GUI, связав с библиотекой telethon. Мне нужно, чтобы подключение к аккаунту выполнялось по кнопке, а далее выполнялась определенная функция, и после ее выполнения бот работает в онлайн режиме, отслеживая новые сообщения в чатах. Не понимаю, как сделать это без зависания интерфейса. Упрощенный код написал для примера:

import telethon
import tkinter
window = tk.Tk() #создаем окно
window.title('Парсер сообщений публичных чатов мессенджера Telegram') #название программы
window.geometry('900x450') #размер окна
#функция кнопки подключения
def connect():
    api_id = int(api_id_tf.get())
    api_hash = api_hash_tf.get()
    phone = phone_tf.get()
    global client
    client = TelegramClient(phone, api_id, api_hash, system_version='4.16.30-vxCUSTOM')

    #функции
    def enter_code():
        try:
            client.sign_in(phone, code)
        except Exception as e:
            messagebox.showerror('Ошибка', f'Неверные данные\n{e}')
            close()
    try:
        client.connect()
    except Exception as e:
        messagebox.showerror('Ошибка', f'Неверные данные\n{e}')
        close()
    else:
        if not client.is_user_authorized():
            try:
                client.send_code_request(phone)
            except Exception as e:
                messagebox.showerror('Ошибка', f'Неверные данные\n{e}')
                close()

#функция другой кнопки, когда уже подключились
def start():
    me = client.get_me()
    
    @client.on(events.NewMessage(chats=chats))
    async def parsing(event):
        me = client.get_me()

    asyncio.run(client.run_until_disconnected())  
  
window.resizable(False, False)
window.mainloop()

я понимаю, что проблема в бесконечных циклах window.mainloop() и client.run_until_disconnected(). Не понимаю, как в таком случае их использовать правильно, помогите пожалуйста. Все работает, но в конце интерфейс зависает просто

Ответы

▲ 0

используй threading,запусти def_start() в другом потоке,GUI не будет зависать

▲ 0

Вариант 1:

  1. Использовать threading при вызове telethon
  2. Отказаться от асинхронности в telethon использовав импорт типа:

from telethon.sync import TelegramClient

Вариант 2:

  1. Отказаться от tkinter в пользу библиотеки, которая из коробки работает с асинхронностью.