在不阻止UI的情况下启动HTTP服务器

时间:2019-05-21 09:16:08

标签: python pyqt5 aiohttp

我正在尝试使用运行网络服务器的python创建一个简单的GUI应用程序,但是我不知道如何在不阻止UI的情况下启动服务器。 我试图在一个新线程上启动它,但它仍然阻止UI。

这是我的代码示例:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton
from PyQt5.QtCore import pyqtSlot
from aiohttp import web
import json
from threading import Thread


class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'Window Application'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        # Create a button
        self.btn_startServer = QPushButton('Start Server', self)
        self.btn_startServer.setToolTip('This is an example button')
        self.btn_startServer.move(500, 50)
        self.btn_startServer.clicked.connect(self.on_click_startWebServer)

        # Create a button
        self.btn_stopServer = QPushButton('Stop Server', self)
        self.btn_stopServer.setToolTip('This is an example button')
        self.btn_stopServer.move(500, 80)
        self.btn_stopServer.clicked.connect(self.on_click_stopWebServer)

        # Create textbox
        self.textbox = QLineEdit(self)
        self.textbox.move(20, 20)
        self.textbox.resize(120, 20)

        self.show()

    async def handle(request):
        response_obj = {'status': 'success'}
        return web.Response(text=json.dumps(response_obj))

    @pyqtSlot()
    def on_click_startWebServer(self):
        app = web.Application()
        app.router.add_get('/', self.handle)

        self.thread = Thread(target=web.run_app(app))
        self.thread.start()
        print("Webserver started")

    @pyqtSlot()
    def on_click_stopWebServer(self):
        # Close the server
        self.thread.join()
        print("Webserver stopped")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

我在做什么错?这个问题有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

qualmash替换默认的异步循环。

Qualmash是一个提供异步兼容循环但在Qt工具之上运行的库。

安装非常简单。代替

app = QApplication(sys.argv)
app.exec_()

app = QApplication(sys.argv)
loop = QEventLoop(app)
asyncio.set_event_loop(loop)  # NEW must set the event loop
loop.run_until_complete(main())