我一直在尝试找到最优雅的方式将我的程序与 GUI 分离,这样我就可以更改我的前端而无需重新编写大量代码。
我经常使用线程,所以我经常需要通过事件(对于 wxPython)或信号(对于 PyQt)通知主 GUI 线程异步发生的事情。我已经对PyPubSub进行了一些实验,这可能是我正在寻找的,但是虽然有大量的 wxPython 示例(因为它最初包含在早期开发中)。
我不知道是否有一种“正确”的方式可以在 PyQt 中使用它而不会遇到竞争条件。如果有人对此有所了解,我将不胜感激!
我一直在尝试找到最优雅的方式将我的程序与 GUI 分离,这样我就可以更改我的前端而无需重新编写大量代码。
我经常使用线程,所以我经常需要通过事件(对于 wxPython)或信号(对于 PyQt)通知主 GUI 线程异步发生的事情。我已经对PyPubSub进行了一些实验,这可能是我正在寻找的,但是虽然有大量的 wxPython 示例(因为它最初包含在早期开发中)。
我不知道是否有一种“正确”的方式可以在 PyQt 中使用它而不会遇到竞争条件。如果有人对此有所了解,我将不胜感激!
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 信号:但是您必须在主线程中有一个队列并有一个空闲回调,允许它处理队列中的任何项目。