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)
Буду очень рад если поможете, уже второй день сижу над этой проблемой