首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyPubSub与PyQt的兼容性

PyPubSub与PyQt的兼容性
EN

Stack Overflow用户
提问于 2018-06-18 17:18:56
回答 1查看 498关注 0票数 0

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

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

我不知道是否有一种“适当”的方法来在PyQt中使用它而不陷入竞争条件。如果有人对此有一些洞察力,我会非常感激的!

EN

回答 1

Stack Overflow用户

发布于 2019-03-24 18:35:42

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

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

还有许多其他的方法,但您有一个基本想法:两个类派生自QObject,其中一个类与预期侦听器在同一个线程中执行实际发送,另一个类使用信号,因此所有东西都是线程安全的。实际上,您不必使用PyQt信号:但是这样就必须在主线程中有一个队列,并有一个空闲回调,允许它处理队列中的任何项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50914555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档