Параллельный поток блокирует основной
Я пишу программу для прошивки 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()