我正在尝试使用运行网络服务器的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_())
我在做什么错?这个问题有什么解决办法吗?
答案 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())