2014-07-25 3 views
2

Я пытаюсь создать простое приложение, которое показывает базовый графический интерфейс и запускает простой веб-сервер в фоновом режиме. Сейчас у меня этот код работает просто отлично:Как правильно закрыть приложение 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?

спасибо.

ответ

0

Я бы связать событие Cmd + Q с командой Tk в "Bind"

def callback(event): 
    print("Cmd-Q recieved, shutting down thread"); 
    thread1.close()  # stop the webServer thread 
    # call any additional exit handler you want 
    root.destroy()   # destroy root window, my syntax may be wrong here 

top.bind("<Cmd-Q>", callback) 

Вы можете решить, как отправить сообщение на webServerThread.

Смежные вопросы