【问题标题】:pyqt5 QThread with SOAP Zeep Client带有 SOAP Zeep 客户端的 pyqt5 QThread
【发布时间】:2018-08-06 04:57:57
【问题描述】:

我正在开发一个带有 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。

知道如何实现这一点

【问题讨论】:

  • 你试过用信号传递数据吗?

标签: multithreading python-3.x pyqt5 zeep


【解决方案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)

【讨论】:

  • 这是否成功可能取决于Client(或其中的任何对象)是否关心在与构造它的线程不同的线程中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
相关资源
最近更新 更多