diff --git a/aqt/main.py b/aqt/main.py index 1ee653ae7..6fbde4b32 100644 --- a/aqt/main.py +++ b/aqt/main.py @@ -111,7 +111,7 @@ class AnkiQt(QMainWindow): f.setupUi(d) f.login.clicked.connect(self.onOpenProfile) f.profiles.itemDoubleClicked.connect(self.onOpenProfile) - f.quit.clicked.connect(lambda: sys.exit(0)) + f.quit.clicked.connect(self.cleanupAndExit) f.add.clicked.connect(self.onAddProfile) f.rename.clicked.connect(self.onRenameProfile) f.delete_2.clicked.connect(self.onRemProfile) @@ -249,8 +249,12 @@ To import into a password protected profile, please open the profile before atte if browser: self.showProfileManager() else: - self.errorHandler.unload() - sys.exit(0) + self.cleanupAndExit() + + def cleanupAndExit(self): + self.errorHandler.unload() + self.mediaServer.shutdown() + self.app.exit(0) # Collection load/unload ########################################################################## diff --git a/aqt/mediasrv.py b/aqt/mediasrv.py index 6ab392f8a..f5f788b46 100644 --- a/aqt/mediasrv.py +++ b/aqt/mediasrv.py @@ -8,6 +8,7 @@ import http.server import socketserver import errno from anki.utils import devMode +import threading # locate web folder in source/binary distribution def _getExportFolder(): @@ -29,7 +30,7 @@ _exportFolder = _getExportFolder() class ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer): pass -class MediaServer(QThread): +class MediaServer(threading.Thread): def run(self): self.port = 10000 @@ -46,8 +47,13 @@ class MediaServer(QThread): break self.server.serve_forever() + def shutdown(self): + self.server.shutdown() + class RequestHandler(http.server.SimpleHTTPRequestHandler): + timeout = 1 + def do_GET(self): f = self.send_head() if f: