Я пытаюсь создать простое приложение, которое показывает базовый графический интерфейс и запускает простой веб-сервер в фоновом режиме. Сейчас у меня этот код работает просто отлично:Как правильно закрыть приложение Tkinter с помощью потоков
import Tkinter
import SimpleHTTPServer
import SocketServer
import threading
import time
import webbrowser
import json
# Load configuration
json_data=open('config.json')
configuration = json.load(json_data)
json_data.close()
# -----------------------------------------
# configuration
# -----------------------------------------
host = configuration["host"]
port = configuration["port"]
folder = configuration["folder"]
url = host + ":" + str(port) + "/" + folder
# -----------------------------------------
# Web Server
# -----------------------------------------
class WebserverThread (threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
self.PORT = port
self.Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
self.httpd = SocketServer.TCPServer(("", self.PORT), self.Handler)
print "--- serving at port", self.PORT
self.httpd.serve_forever()
def close(self):
self.httpd.shutdown()
print "Exiting web server Thread"
# create & start webserver thread, launch browser
thread1 = WebserverThread(1, "Thread-1")
thread1.start()
webbrowser.open_new(url)
# -----------------------------------------
# Graphic User Interface
# -----------------------------------------
# Create window
top = Tkinter.Tk()
top.geometry('200x200')
top.resizable(width=0, height=0)
# start GUI
top.mainloop()
# Handle exit
print "Exiting Main Thread"
thread1.close()
Если закрыть окно GUI с помощью закрытия окна кнопки (красный круг в OSX), приложение занимает несколько секунд и выходит правильно. Проблема возникает, когда я пытаюсь закрыть приложение с помощью Cmd + Q, и в этом случае приложение застыло и не закрывается (мне нужно заставить его закрыть, так как он не будет отвечать).
Я попытался удалить код веб-сервера (поток), и проблема больше не возникает, поэтому похоже, что что-то там работает, но я понятия не имею, как с этим справиться.
Итак, как я могу обрабатывать и правильно закрывать приложение, когда пользователь пытается закрыть приложение через Cmd + Q?
спасибо.