Tkinter зависает из-за telethon

Писал я парсер на питоне, перешел к самому парсингу но во время клика на кнопку весь интерфейс виснет. Размораживается интерфейс только после окончания парсинга. Пробовал через asyncio что-то сделать но не получилось. Может можно как-то через threading?

Код из main.py:

import tkinter as tk
from tkinter import ttk
from Inviter import inviter_design
from settings import settings_design
from parser import parser_design
from databases import databases_design
import asyncio
root = tk.Tk()
def run(root):
    root = root
    root.title("TeleTools")
    root.geometry("500x500")

    tabControl = ttk.Notebook(root)

    tabs = ["Чекер", "Рассылка", "Спамер", "Инвайтер", "Базы", "Парсер", "Настройки"]
    frames = []

    for i in range(len(tabs)):
        frame = ttk.Frame(tabControl)
        frames.append(frame)
        tabControl.add(frame, text=tabs[i])
        if i == 3:
            inviter_design(frame)
        if i == 6:
            settings_design(frame)
        if i == 5:
            parser_design(frame)
        if i == 4:
            databases_design(frame)
    tabControl.pack(expand=1, fill="both")
def open_tab(self, index):
    self.tabControl.select(index)

run(root)
root.mainloop()

Код из parser.py:

import tkinter as tk
from telethon import TelegramClient
from tkinter import ttk
from functions import *
import os
import functions
num = 1
chats = []


def parser_design(frame):
    global chats

    def insert_text(text):
        global num
        additional_text = f"[{num}] {text}\n"
        text_box.config(state=tk.NORMAL)
        text_box.insert(tk.END, additional_text)
        text_box.config(state=tk.DISABLED)
        text_box.see("end")
        num += 1

    def start_parser():
        insert_text(f"Парсер запущен!")
        try:
            api_id = int(functions.get_value("api_id"))
            api_hash = functions.get_value("api_hash")
            session = session_name.get()
            client = TelegramClient(f"sessions/{session}", api_id, api_hash)
            client.start(str(session))
            for dialog in client.iter_dialogs():
                if dialog.is_group:
                    if dialog.name == str(chat_link.get()):
                        target = client.get_entity(dialog)

            msgs = client.get_messages(target, limit=int(users_num.get()))

            temp_list = []

            db = sqlite3.connect("data.db")
            cursor = db.cursor()
            try:
                cursor.execute(f"SELECT id FROM {db_name.get()}")
                temp_list = [int(row[0]) for row in cursor.fetchall()]
                tmp2 = len(temp_list)
            except:
                tmp2 = 0
            database_name = str(db_name.get())
            for message in msgs:
                tmp = client.get_input_entity(message.sender_id)
                try:
                    if tmp.user_id not in temp_list:
                        functions.add_data(database_name, tmp.user_id, tmp.access_hash)
                        temp_list.append(tmp.user_id)
                        insert_text("В базу добавлен новый пользователь")
                except:
                    pass
            client.disconnect()
            insert_text(f"В базу {database_name} добавлено {len(temp_list) - tmp2} новых пользоват"
                        f"елей.")
        except:
            insert_text("""Произошла ошибка при запуске.""")

    def on_account_select(e):

        account = session_name.get()
        global chats
        api_id = int(functions.get_value("api_id"))
        api_hash = functions.get_value("api_hash")
        client = TelegramClient(f"sessions/{account}", api_id, api_hash)
        client.start(str(session_name))
        d = []
        for dialog in client.iter_dialogs():
            if dialog.is_group:
                d.append(dialog.name)
        client.disconnect()
        chat_link["values"] = d

    db_name_frame = ttk.Frame(master=frame)
    ttk.Label(text="Название новой базы пользователей:", master=db_name_frame).pack(side="left")
    db_name = ttk.Entry(master=db_name_frame)
    db_name.pack(side="right")
    db_name_frame.pack(pady=10)

    session_name_frame = ttk.Frame(master=frame)
    ttk.Label(master=session_name_frame, text="Выберите аккаунт для работы:").pack(side="left")
    session_name = ttk.Combobox(values=os.listdir("sessions"), master=session_name_frame)
    session_name.config(state="readonly")
    session_name.bind("<<ComboboxSelected>>", on_account_select)
    session_name.pack(side="right")
    session_name_frame.pack()

    chat_link_frame = ttk.Frame(master=frame)
    ttk.Label(text="Выберите чат:", master=chat_link_frame).pack(side="left")
    chat_link = ttk.Combobox(master=chat_link_frame, values=chats)
    chat_link.config(state="readonly")
    chat_link.pack(side="right")
    chat_link_frame.pack(pady=10)
    users_num_frame = ttk.Frame(master=frame)
    ttk.Label(text="Кол-во юзеров для парсинга:", master=users_num_frame).pack(side="left")
    users_num = ttk.Entry(master=users_num_frame)
    users_num.pack(side="right")
    users_num_frame.pack(pady=10)

    folder_path = 'sessions'
    extension = '.session'
    num_files = sum(1 for file in os.listdir(folder_path) if file.endswith(extension))
    start_btn = ttk.Button(master=frame, text="Начать", command=start_parser)
    start_btn.pack(pady=20)
    if num_files == 0:
        start_btn["state"] = "disabled"
        error_label = ttk.Label(text="Нужен хотя бы 1 аккаунт для начала парсинга.", master=frame)
        error_label.pack()

    scrollbar = ttk.Scrollbar(frame)
    scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

    text_box = tk.Text(frame, yscrollcommand=scrollbar.set)
    text_box.pack()

    text_box.config(state=tk.DISABLED)
    scrollbar.config(command=text_box.yview)

Буду очень рад если поможете, уже второй день сижу над этой проблемой


Ответы (0 шт):