Tkinter не завершается во время выполнения потоков

#python-3.x #tkinter

#python-3.x #tkinter

Вопрос:

Я создаю программу обновления для своего приложения. Там я использовал потоковую обработку для обновления изменений, помимо загрузки файлов. Но когда я пытаюсь завершить код после загрузки всех файлов, это не так!

Вот мой код:

 import os
from tkinter import *
import threading
import time
from google_drive_downloader import GoogleDriveDownloader as gdd

def updatenow():
    global ifexit
    print('Updating')
    #os.remove('myIDLE.exe')
    opening.configure(text= 'Downloading Package (1/1)')

    #gdd.download_file_from_google_drive(file_id='--', dest_path='./myIDLE.exe')
    #gdd.download_file_from_google_drive(file_id='--', dest_path='./get-files.exe')
    opening.configure(text='Installing Packages...')
    #os.system('"get-files.exe"')
    #os.remove('get-files.exe')
    time.sleep(2)
    #os.system('"myIDLE.exe"')
    winstart.destroy()
    exit()

def showlogo():
    global opening, winstart
    winstart = Tk()
    winstart.focus_set()
    winstart.overrideredirect(True)
    window_height = 512
    window_width = 1024
    screen_width = winstart.winfo_screenwidth()
    screen_height = winstart.winfo_screenheight()
    x_cordinate = int((screen_width/2) - (window_width/2))
    y_cordinate = int((screen_height/2) - (window_height/2))
    winstart.geometry("{}x{} {} {}".format(window_width, window_height, x_cordinate, y_cordinate))
    winstart.resizable(0, 0)
    logo = PhotoImage(file='myIDLE Logo.png')
    logolable = Label(winstart, image = logo).pack()

    opening = Label(winstart, text='Preparing for Update...', font=('Helvetica', 14), bg="#1B1D2A", fg="#00A4A3")
    opening.place(x=5, y= 482)
    myt = threading.Thread(target=updatenow)
    myt.start()

    winstart.mainloop()

showlogo()
  

Когда я запускаю это, файл загружается и winstart закрывается, но программа продолжает работать.

Как решить эту проблему?

Комментарии:

1. Что такое exit() ?

2. может быть, @CoolCloud используется для выхода из программы?

3. Может быть, попробуйте import sys , а затем sys.exit(0) вместо этого?

4. @CoolCloud все еще не завершается…

5. Может быть, потому, что оба находятся в разных потоках? Они не могут взаимодействовать друг с другом? Не уверен.

Ответ №1:

Я наконец нашел решение своей собственной проблемы. Проблема заключалась в том, что поток все еще выполнялся даже после уничтожения winstart ( root window).

Проблема была вызвана следующей строкой:

 myt = threading.Thread(target=updatenow)
  

Вместо этого, если мы напишем

 myt = threading.Thread(target=updatenow, daemon=True)
  

когда главное окно будет уничтожено, поток остановится.
И, следовательно, программа завершится с кодом 0.