Python 调用url时pyqt5处于无响应状态

Python 调用url时pyqt5处于无响应状态,python,python-3.x,pyqt,python-requests,pyqt5,Python,Python 3.x,Pyqt,Python Requests,Pyqt5,我刚刚在pyqt中实现了一个登录,但是在调用url和获得响应之间,qt窗口显示的是无响应状态 有人能建议我如何避免不响应状态吗 代码: 1。使用线程:消耗大量时间的任务必须在另一个线程中执行 import requests from PyQt5 import QtCore, QtWidgets class LoginWorker(QtCore.QObject): logged = QtCore.pyqtSignal(bool) def setCredentials(self,

我刚刚在pyqt中实现了一个登录,但是在调用url和获得响应之间,qt窗口显示的是无响应状态 有人能建议我如何避免不响应状态吗

代码:


1。使用线程:消耗大量时间的任务必须在另一个线程中执行

import requests
from PyQt5 import QtCore, QtWidgets

class LoginWorker(QtCore.QObject):
    logged = QtCore.pyqtSignal(bool)

    def setCredentials(self, username, password):
        self.payload = {"username": username, "password": password}

    @QtCore.pyqtSlot()
    def login(self):
        print("payload:", self.payload)
        r = requests.post("http://127.0.0.1:5000/login",data=self.payload)
        print(r.content.decode("utf-8"))
        status = r.status_code == 200
        self.logged.emit(status)

class Login(QtWidgets.QDialog):
    def __init__(self, height, width, parent=None):
        super(Login, self).__init__(parent)
        self.resize(300, 300)
        size = self.geometry()
        self.move((width-size.width())/2, (height-size.height())/2)

        username = QtWidgets.QLabel("Username")
        self.textName = QtWidgets.QLineEdit()
        password = QtWidgets.QLabel("Password")
        self.textPass = QtWidgets.QLineEdit()
        self.textPass.setEchoMode(QtWidgets.QLineEdit.Password)
        self.buttonLogin = QtWidgets.QPushButton('Login')
        self.buttonLogin.clicked.connect(self.handleLogin)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(username, alignment=QtCore.Qt.AlignCenter)
        layout.addWidget(self.textName)
        layout.addWidget(password, alignment=QtCore.Qt.AlignCenter)
        layout.addWidget(self.textPass)
        layout.addWidget(self.buttonLogin)
        layout.addStretch()

        thread = QtCore.QThread(self)
        thread.start()
        self.login_worker = LoginWorker()
        self.login_worker.moveToThread(thread)
        
        self.login_worker.logged.connect(self.onLogged)

    def handleLogin(self):
        # TODO: Connect to flask application to check login credentials
        self.login_worker.setCredentials(self.textName.text(), self.textPass.text())
        QtCore.QTimer.singleShot(0, self.login_worker.login)

    def onLogged(self, status):
        if status:
            self.accept()
        else:
            QtWidgets.QMessageBox.warning(self, 'Error', 'Bad user or password')

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Login(100, 100)
    w.show()
    sys.exit(app.exec_())
2。使用QNAM:

from PyQt5 import QtCore, QtWidgets, QtNetwork

class Login(QtWidgets.QDialog):
    def __init__(self, height, width, parent=None):
        super(Login, self).__init__(parent)
        self.resize(300, 300)
        size = self.geometry()
        self.move((width-size.width())/2, (height-size.height())/2)

        username = QtWidgets.QLabel("Username")
        self.textName = QtWidgets.QLineEdit()
        password = QtWidgets.QLabel("Password")
        self.textPass = QtWidgets.QLineEdit()
        self.textPass.setEchoMode(QtWidgets.QLineEdit.Password)
        self.buttonLogin = QtWidgets.QPushButton('Login')
        self.buttonLogin.clicked.connect(self.handleLogin)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(username, alignment=QtCore.Qt.AlignCenter)
        layout.addWidget(self.textName)
        layout.addWidget(password, alignment=QtCore.Qt.AlignCenter)
        layout.addWidget(self.textPass)
        layout.addWidget(self.buttonLogin)
        layout.addStretch()

    def handleLogin(self):
        # TODO: Connect to flask application to check login credentials
        postData = QtCore.QUrlQuery()
        postData.addQueryItem("username", self.textName.text())
        postData.addQueryItem("password", self.textPass.text())
        qnam = QtNetwork.QNetworkAccessManager()
        url = "http://127.0.0.1:5000/home"
        reply = qnam.post(QtNetwork.QNetworkRequest(QtCore.QUrl(url)), postData.toString(QtCore.QUrl.FullyEncoded).encode())
        loop = QtCore.QEventLoop()
        reply.finished.connect(loop.quit)
        loop.exec_()
        code = reply.attribute(QtNetwork.QNetworkRequest.HttpStatusCodeAttribute)
        if code == 200:
            self.accept()
        else:
            QtWidgets.QMessageBox.warning(self, 'Error', 'Bad user or password')

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Login(100, 100)
    w.show()
    sys.exit(app.exec_())
from PyQt5 import QtCore, QtWidgets, QtNetwork

class Login(QtWidgets.QDialog):
    def __init__(self, height, width, parent=None):
        super(Login, self).__init__(parent)
        self.resize(300, 300)
        size = self.geometry()
        self.move((width-size.width())/2, (height-size.height())/2)

        username = QtWidgets.QLabel("Username")
        self.textName = QtWidgets.QLineEdit()
        password = QtWidgets.QLabel("Password")
        self.textPass = QtWidgets.QLineEdit()
        self.textPass.setEchoMode(QtWidgets.QLineEdit.Password)
        self.buttonLogin = QtWidgets.QPushButton('Login')
        self.buttonLogin.clicked.connect(self.handleLogin)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(username, alignment=QtCore.Qt.AlignCenter)
        layout.addWidget(self.textName)
        layout.addWidget(password, alignment=QtCore.Qt.AlignCenter)
        layout.addWidget(self.textPass)
        layout.addWidget(self.buttonLogin)
        layout.addStretch()

    def handleLogin(self):
        # TODO: Connect to flask application to check login credentials
        postData = QtCore.QUrlQuery()
        postData.addQueryItem("username", self.textName.text())
        postData.addQueryItem("password", self.textPass.text())
        qnam = QtNetwork.QNetworkAccessManager()
        url = "http://127.0.0.1:5000/home"
        reply = qnam.post(QtNetwork.QNetworkRequest(QtCore.QUrl(url)), postData.toString(QtCore.QUrl.FullyEncoded).encode())
        loop = QtCore.QEventLoop()
        reply.finished.connect(loop.quit)
        loop.exec_()
        code = reply.attribute(QtNetwork.QNetworkRequest.HttpStatusCodeAttribute)
        if code == 200:
            self.accept()
        else:
            QtWidgets.QMessageBox.warning(self, 'Error', 'Bad user or password')

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Login(100, 100)
    w.show()
    sys.exit(app.exec_())