#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.