0

我正在开发一个带有 GUI 的简单应用程序,它通过 SOAP 连接到服务器并请求一些数据,这些数据以 XML 格式返回

我能够在我的应用程序中成功运行,但由于线程,GUI 冻结,直到完成完整的 SOAP 请求并返回其值

现在我正在尝试将我的应用程序运行到线程中,我创建了一个线程,它首先检查并验证 SOAP 连接是否成功

连接验证

class WorkerThread(QThread):
    def __init__(self, parent=None):
        super(WorkerThread, self).__init__(parent)

    def run(self):
        self.session = Session()
        self.session.verify = False
        self.cucmurl = 'https://URL'
        self.session.auth = HTTPBasicAuth(user, pass)
        self.cache = SqliteCache(path='/tmp/sqlite.db', timeout=10)
        self.trself.clientansport = Transport(session=self.session, cache=self.cache)
        self.client = Client(wsdl, transport=self.transport, strict=False)

以上工作可以很好地验证连接,但我想稍后在我的代码中使用 self.client 以便开始启动与服务器的 SOAP 连接

class MainAPP(QTabWidget, UI_File):
     def __init__(self, parent=None):

      def getinfor(self):
       output_2 = self.client.getinfor('')

函数 getinfor 应该能够使用来自 WorkerThread 的 self.client。

任何想法如何做到这一点

4

1 回答 1

1

您可以通过来自工作线程的信号发出客户端并将其设置在主窗口中。

class WorkerThread(QThread):

    client_signal = pyqtSignal(object)

    def __init__(self, parent=None):
        super(WorkerThread, self).__init__(parent)

    def run(self):
        # code here
        self.client = Client(wsdl, transport=self.transport, strict=False)
        self.client_signal.emit(self.client)


class MainApp(QTabWidget, UI_File):

    def __init__(self):
        self.client = None

    def set_client(self, client):
        self.client = client

    def setup_thread(self):
        self.worker_thread = WorkerThread()
        self.worker_thread.client_signal.connect(self.set_client)
于 2018-02-26T17:18:15.350 回答