Параллельный поток блокирует основной

Я пишу программу для прошивки oculus quest 2. Мне надо скачивать прошивку с сайта, если она еще не скачена. Я использую такой код:

def progress_update(*args):
    global pogress
    pogress["value"] = (args[0]/args[1]*100)

root = Tk()
root.geometry("500x500+710+290")
pogress = ttk.Progressbar(orient="horizontal", length=475)
pogress.place(x=10, y=440)

if "firmware.zip" not in os.listdir("./"):
    if askyesno("Прошивка не найдена", "Прошивка не найдена. Загрузить сейчас?"):
        bs = BeautifulSoup(requests.get("https://cocaine.trade/Quest_2_firmware").text, "lxml")
        res = bs.find_all('a', 'fw-link')[-1].get("href")
        multiprocessing.Process(target=wget.download(res, bar=progress_update), daemon=True).start()

Но несмотря на многопоточность главное окно tkinter зависает: введите сюда описание изображения

Кроме multiprocessing пробовал еще Threads, но это ничего не поменяло. Как можно запустить скачивание в другом потоке не мешая при этом tkinter?


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

Автор решения: IvanProkshin

Все оказалось довольно просто. Спасибо @Amgarak за помощь в решении. Нужно просто в функции обновления прогрессбара обновлять и само окно:

def progress_update(*args):
    global progress
    progress["value"] = (args[0]/args[1]*100)
    root.update()

Так же еще подсказали, что я забыл про то, что multiprocessing.Process в target принимает объект типа callable, но я просто вызвал функцию. Нужно было использовать лямбда-функцию:

multiprocessing.Process(target=lambda: wget.download(res, bar=progress_update), daemon=True).start()
→ Ссылка