PyPubSub和PyQt之间的兼容性

时间:2018-06-18 17:18:56

标签: python python-3.x pyqt pypubsub

我一直在努力寻找最优雅的方法将我的程序与GUI分离,这样我就可以改变我的前端,而无需重新编写大量的代码。

我经常使用线程,所以我经常需要通过事件(对于wxPython)或信号通知主要GUI线程的异步事件(对于PyQt的)。我已经尝试了PyPubSub,这可能是我正在寻找的,但是虽然有大量的wxPython示例(因为它最初包含在早期开发中)。

我不知道是否有适当的'在没有遇到竞争条件的情况下将它与PyQt一起使用的方法。如果有人对此有所了解,我将非常感激!

1 个答案:

答案 0 :(得分:0)

PyPubSub的sendMessage()将在与发件人相同的线程中调用侦听器(默认Python行为)。在多线程GUI应用程序中,必须确保在主线程中调用了与GUI交互的侦听器。此外,线程是独立执行的,因此您需要每个线程基于定时或空闲的回调机制来调用自己的侦听器。

在PyQt的正确线程中调用侦听器的方法是通过信号。 PyPubSub仍可以在多线程PyQt GUI中使用,但是用于将“消息”从发送方传输到侦听方的机制必须通过信号进行。我认为没有最好的方法,这取决于应用程序设计的细节。例如,您可以有一个QtPubsubHandler派生自QObject并在主线程中创建,而一个QtPubsubSender类也派生自QObject并在每个工作线程中创建。 QtPubSubSender定义了pubsub连接到的自定义信号,例如QtPubsubHandler。然后,要发送消息,发送方执行qtPubsubHandler.sendMessage(topic, **data),这会导致发出pubsub信号,Qt会正确排队并最终发信号通知QtPubsubHandler,后者实际上会调用pub.sendMessage()

还有许多其他方法,但是您有一个大致的概念:两个派生自QObject的类,其中一个在与预期的侦听器相同的线程中进行实际发送,另一个使用信号,因此一切都是线程安全的。实际上,您不必使用PyQt信号:但是您将必须在主线程中有一个队列,并有一个空闲的回调函数,该回调函数使其可以处理队列中的任何项目。