【问题标题】:What is the correct implementation of a mulithreaded python GUI in PyQt4PyQt4中多线程python GUI的正确实现是什么
【发布时间】:2015-10-27 12:25:49
【问题描述】:

我正在努力将旧的 Java GUI 修改为 python,并决定尝试在 PyQt4 中创建和实现它。

原始程序连接到外部服务器,并使用服务器设置的数据来更新各种图形。这些图形是从主 GUI 中打开的,并且彼此独立地操作和更新。

我设法设置了一些类似的东西来打开一个主 GUI 窗口,并连接到外部服务器。当我从服务器获取新数据时,我遇到的问题是更新一个数字(我想我会从一个数字开始,然后从那里增加)。

由于我对通过 PyQt 在 GUI 中设置客户端到服务器连接或线程缺乏理解或发现 python 文档,我已经实施了各种解决方法。我连接到服务器并通过扭曲的客户端读取数据。此客户端在从 python 线程模块实现的单独线程上运行。这至少从我能说的情况来看是有效的。

我可以从主窗口使用新更新的数据打开图形,但我似乎无法从扭曲的客户端线程更新它们。我收到如下错误:

QObject::setParent: 无法设置父级,新父级在不同的线程中 要么 exceptions.RuntimeError: 主线程不在主循环中

根据我的研究,我了解到对于 PyQt 窗口必须从主线程更新。我不知道该怎么做。我当前的实现有主线程承载主初始窗口,我不确定如何在收到新数据时触发它来更新子窗口。

是否有任何想法或链接可以让我了解如何实现这一点,或者有什么更好的框架或 GUI 设置?

编辑:我的代码的当前设置创建了设置客户端连接并处理服务器消息的线程,当前设置为守护线程。因为,除非与服务器的连接丢失,否则它没有退出条件。 Twisted 客户端不允许用户返回数据,但由于我需要更新数据的数据存储在 self 变量中,因此它们在每个新数据包期间都会更新。 QTread 的所有示例似乎都有一个退出条件,如果没有一个,我将如何让它工作?或者我如何设置我的客户端有一个退出语句,然后重新连接以获取下一条消息?

【问题讨论】:

  • 我有一个名为qtutils 的库,可用于在主线程中运行任意方法。这可用于从 Python 线程调用图形更新代码,同时确保它在主线程中运行。文档是here。然而,大多数人会改为使用QThread 并发出一个连接到主线程中的方法的信号。
  • 检查我对这个类似问题的回答:stackoverflow.com/a/24821300/2319400
  • 这些示例很有帮助,但从我目前所见,我无法设置线程以便它可以退出,并且您的所有示例似乎都包含一个设置要退出的线程。我将编辑我的问题并提供更多详细信息。

标签: python multithreading user-interface pyqt4


【解决方案1】:

使用QThread 代替python 线程,并按照the documentation 中的建议创建自己的工作类。 (使用 WorkerThread 的第二个示例)。

【讨论】:

  • 我认为这会有所帮助,但我对文档有一些疑问: 1. 如何在 python 中实现信号和插槽 2. 如果我需要重复启动线程,我将如何设置它在 python 中。它说明了一些关于 exec 的内容,但我不太确定那是什么意思。
  • 正如塞巴斯蒂安在他对您的回答的评论中指出的那样,看看他的解决方案:stackoverflow.com/questions/24820063/… 这是一个非常好的实现,它演示了文档中示例的 Python 方式。您可以通过简单地重新启动线程来重新启动它。
  • 我使用 sebastians 链接的建议将所有线程实例更改为 QThread。对于正在运行 1 个连续线程的客户端连接。单独的数字会在此客户端线程的其他 QThreads 中更新,因为只要您只更新 GUI 并且不添加或删除任何内容,它就可以工作。
猜你喜欢
  • 2020-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多