Поток, вызванный кнопкой, не завершается после завершения функции - PullRequest
0 голосов
/ 30 ноября 2018

Python Verison 3.7 |NPM версия 6.2.0 |Пакет Google Lighthouse версии 4.0.0

Я пытаюсь создать довольно простое окно Tkinter для автоматизации пакета NPM Google Lighthouse, но мне не удается остановить поток.

Нить:

lighthouse_thread = threading.Thread(target=start_lighthouse)

И кнопка запуска потока:

Start_Ligthouse = Button(root, text="Starten", command=lighthouse_thread.start)
Start_Ligthouse.place(x=850, y=312)
Start_Ligthouse.config(state=DISABLED)
root.after(100, CheckInOut)

Функция выглядит следующим образом:

def start_lighthouse():                                                                                                                                         
    global filenumber
    global reportlocation
    global instantkill
    global file

    Start_Ligthouse.config(state=DISABLED)   
    for url in file:
        url = url.rstrip("\n")
        print(url)
        filename = url.replace("https","").replace("/","-").replace("\n","").replace(":","").replace("--","")

        if os.path.isfile(reportlocation + "/" + filename + ".html"):
            print("EXISTS!")
            filenumber = 2
            while True:                                                                                                                                         
                newfilename = filename + "{}".format(filenumber)
                if not os.path.isfile(reportlocation + "/" + newfilename + ".html"):
                    filename = newfilename
                    break
                filenumber += 1
        if instantkill:
            break


        #os.system("lighthouse --disable-device-emulation --throttling-method=provided --preset=perf --quiet --output-path={}/{}.html {}".format(reportlocation,filename,url))

    CheckIn = False
    CheckOut = False
    print("LoopEnded")

Я прокомментировал команду os.system, чтобы быстро бегать по списку.Если бы мне пришлось снова вызывать функцию, я получаю ошибку, что поток не может быть запущен дважды (что я понимаю). Но, насколько я понял, поток должен завершиться после завершения функции.

Мой вопрос: как я могу завершить поток после того, как он завершил то, что должен был сделать?

Полный код можно найти здесь

1 Ответ

0 голосов
/ 30 ноября 2018

Благодаря @JamesKent я исправил это.

Вместо вызова потока с помощью кнопки я создал функцию, которая создает поток.

def create_thread():
    print("Thread Created")
    lighthouse_thread = threading.Thread(target=start_lighthouse)
    lighthouse_thread.start()

Кнопка теперь вызывает эту функцию итаким образом создает новую тему.

Start_Ligthouse = Button(root, text="Starten", command=create_thread)
...