我一直试图找到一种最优雅的方法将我的程序从GUI中分离出来,这样我就可以改变我的前端,而不需要重新编写大量代码。
我经常使用线程,所以我经常需要通过事件(对于wxPython)或信号(对于PyQt)通知主GUI线程发生的异步事件。我已经对PyPubSub做了一些实验,这可能就是我想要的,但是有大量的wxPython示例(因为它最初包含在早期开发中)。
我不知道是否有一种“适当”的方法来在PyQt中使用它而不陷入竞争条件。如果有人对此有一些洞察力,我会非常感激的!
发布于 2019-03-24 18:35:42
PyPubSub的sendMessage()将在与发送方相同的线程中调用侦听器(默认的Python行为)。在多线程GUI应用程序中,必须确保在主线程中调用与GUI交互的侦听器。此外,线程独立执行,因此需要每个线程根据定时或空闲回调机制调用自己的侦听器。
在PyQt中调用正确线程中的侦听器的方法是通过信号。PyPubSub仍然可以在多线程PyQt GUI中使用,但是用于将“消息”从发送方传递到侦听器的机制必须是通过信号。没有一个最好的方法,我不认为,取决于你的应用程序设计的细节。例如,您可以拥有一个从QtPubsubHandler派生并在主线程中创建的QtPubsubSender类,以及一个也从QObject派生并在每个工作线程中创建的QtPubsubSender类。QtPubSubSender定义了一个自定义信号,比如pubsub,QtPubsubHandler连接到该信号。然后,发送方执行qtPubsubHandler.sendMessage(topic, **data),这会导致发出pubsub信号,Qt正确地排队,并最终向QtPubsubHandler发出信号,QtPubsubHandler实际上调用了pub.sendMessage()。
还有许多其他的方法,但您有一个基本想法:两个类派生自QObject,其中一个类与预期侦听器在同一个线程中执行实际发送,另一个类使用信号,因此所有东西都是线程安全的。实际上,您不必使用PyQt信号:但是这样就必须在主线程中有一个队列,并有一个空闲回调,允许它处理队列中的任何项。
https://stackoverflow.com/questions/50914555
复制相似问题