我正在尝试实现zmq和Pyforms GUI,它们都需要自己的事件循环。任务是使用带有文本字段的Pyforms GUI,显示传入的zmq消息。这是……
提前道歉的是一个模糊的答案,但也许它可以作为一个潜在的起点。
PyForms最终看起来像是基于Qt。我认为可以使用套接字(好吧,文件描述符)作为输入偶数源。 ZeroMQ,至少是C版本,公开了一个文件描述符,当收到ZMQ消息时,该文件描述符变为准备读取。所以原则上,Qt可以使用这个文件描述符来调用一个回调来读取ZMQ套接字收到的消息,并在Qt事件循环的线程上处理消息(这可能有其他好处!)。
PyZMQ和PyForms是否暴露了这些,恐怕我不知道。
感谢Bazza的意见。你的回答帮助我找到解决问题的方法。在搜索了我如何发射Qevent之后;我找到了以下示例 例 并解决了这个问题。 最终代码如下所示:
import pyforms from pyforms import BaseWidget from pyforms.controls import ControlTextArea from pyforms.controls import ControlButton import threading import zmq from PyQt5 import QtCore class ZeroMQ_Listener(QtCore.QObject): message = QtCore.pyqtSignal(str) def __init__(self): QtCore.QObject.__init__(self) # Socket to talk to server context = zmq.Context() self.socket = context.socket(zmq.PULL) self.socket.connect('tcp://127.0.0.1:5014') print('connected!') self.running = True def loop(self): while self.running: string = self.socket.recv_string() self.message.emit(string) class SimpleExample1(BaseWidget): def __init__(self): super(SimpleExample1,self).__init__('Simple example 1') #Definition of the forms fields self._controltextarea = ControlTextArea('textarea to show incoming zmq messages') self._button = ControlButton('Press this button') message = QtCore.pyqtSignal(str) self.thread = QtCore.QThread() self.zeromq_listener = ZeroMQ_Listener() self.zeromq_listener.moveToThread(self.thread) self.thread.started.connect(self.zeromq_listener.loop) self.zeromq_listener.message.connect(self.signal_received) QtCore.QTimer.singleShot(0, self.thread.start) def signal_received(self, message): self._controltextarea.__add__(message) #Execute the application if __name__ == "__main__": guiThread = threading.Thread(target=pyforms.start_app( SimpleExample1 )) guiThread.start()
非常感谢和最好的问候!!!