PyPubSub和PyQt之间的兼容性

问题描述 投票:0回答:1

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

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

我不知道是否有一种'正确'的方式与PyQt一起使用它而不会遇到竞争条件。如果有人对此有所了解,我将非常感激!

python python-3.x pyqt pypubsub
1个回答
0
投票

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

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

还有很多其他的方法,但你得到了一般的想法:两个派生自QObject的类,其中一个在与预期监听器相同的线程中实际发送,另一个使用信号,因此一切都是线程安全的。实际上你不必使用PyQt信号:但是你必须在主线程中有一个队列并有一个空闲的回调,允许它处理队列中的任何项目。

© www.soinside.com 2019 - 2024. All rights reserved.