Сбой Python при срыве главного окна

1

Я получаю эту ошибку при запуске приведенного ниже кода. Я понимаю, что это не удается из-за разрыва главного окна, не находящегося на главной нити. Просто не совсем уверен, как это изменить.

Tcl_AsyncDelete: обработчик async удален из-за неправильного потока

def download(url, filename):
root = progressbar = quit_id = None
ready = Event()

def reporthook(blocknum, blocksize, totalsize):
    nonlocal quit_id
    if blocknum == 0:  # started downloading
        def guiloop():
            nonlocal root, progressbar
            root = Tk()
            root.withdraw()  # hide
            progressbar = ttk.Progressbar(root, length=400)
            progressbar.grid()
            # show progress bar if the download takes more than .5 seconds
            root.after(500, root.deiconify)
            ready.set()  # gui is ready
            root.mainloop()

        Thread(target=guiloop).start()
    ready.wait(1)  # wait until gui is ready
    percent = blocknum * blocksize * 1e2 / totalsize  # assume totalsize > 0
    if quit_id is None:
        root.title('%%%.0f %s' % (percent, filename,))
        progressbar['value'] = percent  # report progress
        if percent >= 100:  # finishing download
            quit_id = root.after(0, root.destroy)  # close GUI
return urlretrieve(url, filename, reporthook)
  • 0
    ПОЛУЧИЛ ЭМ Я добавил "quit_id = root.after (0, root.protocol (" WM_DELETE_WINDOW ", on_closing ())) # close GUI" с функцией root.destroy ()
Теги:
tkinter
python-multithreading

1 ответ

0
import sys
from threading import Event, Thread
from tkinter import Tk, ttk
from urllib.request import urlretrieve

def download(url, filename):
    root = progressbar = quit_id = None
    ready = Event()

def on_closing(): root.destroy()

    def reporthook(blocknum, blocksize, totalsize):
        nonlocal quit_id
        if blocknum == 0: # started downloading
            def guiloop():
                nonlocal root, progressbar
                root = Tk()
                root.withdraw()  # hide
                progressbar = ttk.Progressbar(root, length=400)
                progressbar.grid()

                # show progress bar if the download takes more than .5 seconds
                root.after(500, root.deiconify)
                ready.set() # gui is ready
                root.mainloop()
            Thread(target=guiloop).start()
        ready.wait(1) # wait until gui is ready
        percent = blocknum * blocksize * 1e2 / totalsize # assume totalsize > 0
        if quit_id is None:
            root.title('%%%.0f %s' % (percent, filename,))
            progressbar['value'] = percent # report progress
            if percent >= 100:  # finishing download

quit_id = root.after(0, root.protocol("WM_DELETE_WINDOW", on_closing())) # закрыть GUI

    return urlretrieve(url, filename, reporthook)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню