Pyqt5 代理类型对该操作无效

Posted

技术标签:

【中文标题】Pyqt5 代理类型对该操作无效【英文标题】:Pyqt5 the proxy type is invalid for this operation 【发布时间】:2021-09-03 13:18:57 【问题描述】:

我以前使用that 代码,它对我有用。 但是现在,有些事情发生了变化,我遇到了这个错误:

the proxy type is invalid for this operation

我发现如果代理设置关闭它仍然可以工作,但是我应该怎么做才能解决这个代理问题?

这是我使用的代码示例:

from functools import cached_property
import sys

from PyQt5 import QtCore, QtGui, QtWidgets, QtNetwork


class Client(QtCore.QObject):
    messageChanged = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.socket.stateChanged.connect(self.handle_state_changed)
        self.socket.errorOccurred.connect(self.handle_error_occurred)
        self.socket.readyRead.connect(self.handle_ready_read)

    @cached_property
    def socket(self):
        return QtNetwork.QTcpSocket()

    def try_connect(self):
        self.socket.connectToHost("127.0.0.1", 5555)

    def handle_state_changed(self, state):
        print(f"state: state")
        if state == QtNetwork.QAbstractSocket.UnconnectedState:
            print("disconnected")
            QtCore.QTimer.singleShot(1000, self.try_connect)
        elif state == QtNetwork.QAbstractSocket.ConnectedState:
            print("connected")

    def handle_error_occurred(self, error):
        print(f"error code error, message: self.socket.errorString()")

    def handle_ready_read(self):
        codec = QtCore.QTextCodec.codecForName("UTF-8")
        message = codec.toUnicode(self.socket.readAll())
        self.messageChanged.emit(message)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.client.messageChanged.connect(self.handle_message_changed)
        self.client.try_connect()

    @cached_property
    def client(self):
        return Client()

    def handle_message_changed(self, message):
        print(f"client message: message")


def main():

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

我也看到了issue,但我不明白如何在我的代码中使用它。

【问题讨论】:

您是否在问如何绕过现有代理使其工作?似乎链接的解决方案是您应该做的,还有什么不清楚的地方? @musicamante 是的,我知道如何使它与现有代理一起工作。我无法关闭 Windows 上的代理设置。 【参考方案1】:

我想通了。我应该在连接之前设置一个“NoProxy”类型。就像在that 主题中一样。

我的例子:

class Client(QtCore.QObject):
messageChanged = QtCore.pyqtSignal(str)

def __init__(self, parent=None):
    super().__init__(parent)
    self.proxy = QtNetwork.QNetworkProxy(QtNetwork.QNetworkProxy.NoProxy)
    self.socket.stateChanged.connect(self.handle_state_changed)
    self.socket.errorOccurred.connect(self.handle_error_occurred)
    self.socket.readyRead.connect(self.handle_ready_read)

@cached_property
def socket(self):
    return QtNetwork.QTcpSocket()

def try_connect(self):
    self.socket.setProxy(self.proxy)
    self.socket.connectToHost("ADDRESS", PORT)

这对我有用。

【讨论】:

以上是关于Pyqt5 代理类型对该操作无效的主要内容,如果未能解决你的问题,请参考以下文章

连接到代理后面的 Azure Batch - 操作返回了无效的状态代码“禁止”

类型的无效操作数 - C++

Proxy详解

Docker Swarm 代理 - 类型的挂载配置无效

sql server 2008 代理服务提供的凭据无效

在 iTunes 上上传构建时捆绑操作系统类型代码无效