”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何有效管理 PyQt 应用程序中的线程?

如何有效管理 PyQt 应用程序中的线程?

发布于2024-11-03
浏览:421

How to Effectively Manage Threads in PyQt Applications?

如何利用Python的PyQt库来管理线程

PyQt为在Python应用程序中构建图形用户界面提供了一个强大的框架。为了确保执行后台任务时 UI 更新流畅且响应灵敏,Qt 利用与主 GUI 线程同时运行的线程。然而,有效地使用线程需要仔细考虑。

正如 Maya Posch 的文章中所述,在使用 QThreads 时,重新实现 run 方法不应该是首选方法。相反,请考虑使用信号和槽来促进线程之间的通信。为了说明正确的实现,将提供一个实际示例。

PyQt 线程管理示例

在示例中,我们创建一个单独的工作线程来处理长计算而主 GUI 线程则管理图形界面。工作线程通过信号将状态更新传达给 GUI。

要开始计算,用户单击“开始”按钮。 “取消”按钮可用于终止操作并重置工作线程。请注意,通常不建议强制终止线程,但用于演示目的。

Python 代码

from PyQt4 import QtGui, QtCore
import sys
import random

class Example(QtCore.QObject):

    signalStatus = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)

        # Create a gui object.
        self.gui = Window()

        # Create a new worker thread.
        self.createWorkerThread()

        # Make any cross object connections.
        self._connectSignals()

        self.gui.show()


    def _connectSignals(self):
        self.gui.button_cancel.clicked.connect(self.forceWorkerReset)
        self.signalStatus.connect(self.gui.updateStatus)
        self.parent().aboutToQuit.connect(self.forceWorkerQuit)


    def createWorkerThread(self):

        # Setup the worker object and the worker_thread.
        self.worker = WorkerObject()
        self.worker_thread = QtCore.QThread()
        self.worker.moveToThread(self.worker_thread)
        self.worker_thread.start()

        # Connect any worker signals
        self.worker.signalStatus.connect(self.gui.updateStatus)
        self.gui.button_start.clicked.connect(self.worker.startWork)


    def forceWorkerReset(self):      
        if self.worker_thread.isRunning():
            print('Terminating thread.')
            self.worker_thread.terminate()

            print('Waiting for thread termination.')
            self.worker_thread.wait()

            self.signalStatus.emit('Idle.')

            print('building new working object.')
            self.createWorkerThread()


    def forceWorkerQuit(self):
        if self.worker_thread.isRunning():
            self.worker_thread.terminate()
            self.worker_thread.wait()


class WorkerObject(QtCore.QObject):

    signalStatus = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)

    @QtCore.pyqtSlot()        
    def startWork(self):
        for ii in range(7):
            number = random.randint(0,5000**ii)
            self.signalStatus.emit('Iteration: {}, Factoring: {}'.format(ii, number))
            factors = self.primeFactors(number)
            print('Number: ', number, 'Factors: ', factors)
        self.signalStatus.emit('Idle.')

    def primeFactors(self, n):
        i = 2
        factors = []
        while i * i  1:
            factors.append(n)
        return factors


class Window(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button_start = QtGui.QPushButton('Start', self)
        self.button_cancel = QtGui.QPushButton('Cancel', self)
        self.label_status = QtGui.QLabel('', self)

        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button_start)
        layout.addWidget(self.button_cancel)
        layout.addWidget(self.label_status)

        self.setFixedSize(400, 200)

    @QtCore.pyqtSlot(str)
    def updateStatus(self, status):
        self.label_status.setText(status)


if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    example = Example(app)
    sys.exit(app.exec_())

此示例演示了 PyQt 应用程序中 QThreads 的正确使用,允许高效的后台操作而不冻结用户界面。

版本声明 本文转载于:1729302445如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何有效地将PHP变量插入字符串?
    如何有效地将PHP变量插入字符串?
    将 PHP 变量插入字符串将 PHP 变量合并到字符串中时,注意语法以确保所需的输出是至关重要的获得。为了解决这个问题,让我们检查一下提示中显示的代码:目标是包含 $ width 变量在宽度样式属性中,并确保其后跟“px”。不幸的是,尝试用空格分隔变量和“px”或将它们连接在一起会导致错误。解决方案...
    编程 发布于2024-11-08
  • 了解 JavaScript 中下划线 (`_`) 的使用
    了解 JavaScript 中下划线 (`_`) 的使用
    在 JavaScript 中编码时,您可能会遇到用作变量名称的下划线字符 (_),特别是在函数参数中。虽然乍一看似乎很不寻常,但由于各种原因,这种做法在开发人员中很常见。在这篇博文中,我们将探讨下划线代表什么,为什么使用它,以及它在现实示例中的显示方式,例如 coalesceES6 函数。 ...
    编程 发布于2024-11-08
  • 像程序员一样思考:学习 C 基础知识
    像程序员一样思考:学习 C 基础知识
    以程序员思维学习 C 语言:基本语法:变量、数据类型、常量、运算符、控制流。实战案例:计算两个数的平均值,输入两个整数并计算其平均值。以程序员思维思考:用 C 语言学习基础引言学习编程并不难,尤其是当你以程序员思维思考时。本文将从基础开始,用 C 语言引导你逐步了解编程入门知识。C 语言基本语法变量...
    编程 发布于2024-11-08
  • Python 中的列表理解语法何时需要三元运算符?
    Python 中的列表理解语法何时需要三元运算符?
    列表理解难题:可迭代对象中的条件过滤在 Python 中,列表理解提供了一种基于现有可迭代对象创建列表的简洁方法。然而,出现了一个关于涉及 if 语句的列表理解的问题。目标是比较两个可迭代对象 a 和 b,并仅打印两者中出现的元素。预期的代码如下所示:print([y if y not in b f...
    编程 发布于2024-11-08
  • 使用 MetaTrader 订单管理和市场数据收集进行自动交易
    使用 MetaTrader 订单管理和市场数据收集进行自动交易
    Your AsimovMT class provides a comprehensive interface for interacting with MetaTrader5 (MT5) using Python. However, there are several areas in your c...
    编程 发布于2024-11-08
  • Python 列表的最大大小是多少以及它如何影响功能?
    Python 列表的最大大小是多少以及它如何影响功能?
    Python列表的最大大小:综合分析在Python中,列表是基本的数据结构,可以容纳多个不同类型的元素。它们的多功能性和灵活性使得了解它们的局限性至关重要,特别是在处理大型数据集时。本文探讨了 Python 列表可以达到的最大大小及其对其功能的影响。最大列表大小Python 列表的最大大小已定义通过...
    编程 发布于2024-11-08
  • 托管平台列表:综合指南
    托管平台列表:综合指南
    在数字时代,可靠的托管平台对于任何在线展示都至关重要,无论是个人博客、电子商务网站还是公司网站。有无数的选项可供选择,选择合适的托管平台可能会令人畏惧。本指南将帮助您浏览当今一些最好的托管平台,比较它们的功能、价格和对不同需求的适用性。 1. 蓝色主机 概述:Bluehost 是最受...
    编程 发布于2024-11-08
  • 在浏览器中将视频压缩为 webm
    在浏览器中将视频压缩为 webm
    ?增强您的网络视频:使用 React 将 MP4 压缩为 WebM 工作中没有任何有趣的事情感到无聊吗?好吧,就在那时我决定抓紧时间修补浏览器 API 的当前状态。我们可以直接通过 Web API 压缩视频吗?在这篇博客中,我将向您展示如何使用现代浏览器功能将 MP4 视频压缩为 ...
    编程 发布于2024-11-08
  • 现代 PHP 中的 PHP Fiber 并发性
    现代 PHP 中的 PHP Fiber 并发性
    PHP Fibers 在 PHP 8.1 中引入,带来了一种令人兴奋的新方法来处理 PHP 中的并发和异步编程。纤维允许您在执行过程中暂停和恢复函数,使开发人员能够更好地控制非阻塞操作,例如处理 I/O、数据库查询或 HTTP 请求,而无需停止整个脚本。 在本博客中,我们将探讨 PHP 纤维、它们的...
    编程 发布于2024-11-08
  • Laravel 的新时代:Accel 的百万美元 A 轮融资——这就是为什么它改变了游戏规则!
    Laravel 的新时代:Accel 的百万美元 A 轮融资——这就是为什么它改变了游戏规则!
    各位,请戴好帽子! Laravel 刚刚发布了一些激动人心的消息,震惊了开发界——由 Accel 领投的 A 轮融资 5700 万美元。作为一名热情的 Laravel 用户和企业家同事,这一公告在整个 PHP 社区引起了震动,我感到非常兴奋!那么,让我们来分析一下为什么这项投资意义重大,以及为什么 ...
    编程 发布于2024-11-08
  • C++11 的 `string::c_str()` 仍然以 Null 终止吗?
    C++11 的 `string::c_str()` 仍然以 Null 终止吗?
    C 11 的 string::c_str() 是否消除空终止?在 C 11 中,string::c_str 不再保证产生一个以 null 结尾的字符串。原因:在 C 11 中, string::c_str 的定义与 string::data 相同,而 string::data 又被定义相当于 *(b...
    编程 发布于2024-11-08
  • 数据分析师清单
    数据分析师清单
    SQL 清单 Excel女士清单 Power BI 清单 Tableau 清单 Python 清单 关注此 WhatsApp 频道以获取更多资源
    编程 发布于2024-11-08
  • 如何在 Go 中将 YAML 字段动态解析为有限结构集?
    如何在 Go 中将 YAML 字段动态解析为有限结构集?
    在 Go 中将 YAML 字段动态解析为有限结构体集简介在 Go 中将 YAML 解析为结构体非常简单。但是,当 YAML 字段可以表示多个可能的结构时,任务就会变得更加复杂。本文探讨了使用 Go 的 YAML 包的动态方法。使用 YAML v2 进行动态解组对于 Yaml v2,可以使用以下方法:...
    编程 发布于2024-11-08
  • 如何在 Python 中执行指数和对数曲线拟合?
    如何在 Python 中执行指数和对数曲线拟合?
    曲线拟合:Python 中的指数和对数方法虽然 Python 中可以使用 polyfit() 轻松进行多项式曲线拟合,但本指南探讨了指数和对数曲线的方法拟合。对数拟合要拟合 y = A B log x 形式的直线,只需执行 y 对 log x 的多项式拟合。import numpy as np x ...
    编程 发布于2024-11-08
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3