【pyqt5】【多线程】【matplotlib】解决子线程上运行的matplotlib无法在主线程上的UI界面上绘制图形的问题

这篇具有很好参考价值的文章主要介绍了【pyqt5】【多线程】【matplotlib】解决子线程上运行的matplotlib无法在主线程上的UI界面上绘制图形的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

在使用PyQt5为一个项目写UI界面的时候,我试图把matplotlib绘制的图像展示在UI界面的窗口中,但matplotlib是运行在一个子线程中的,这导致它出现了如下警告:UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail.并且我无法使用matplotlib.backends.backend_qt5agg 下的 FigureCanvasQTAgg直接把图像绘制在UI窗口中,经过我测试如果matplotlib运行在主线程中的话就不会出现该问题。

解决方法

我用了一个笨办法,那就是使用IO.BytesIO()把matplotlib绘制的图像以png或者jpeg格式的二进制流保存在内存中,然后用PIL.Image.open()打开为图片,然后把这张图片经过处理后传递给窗口显示。

buf = io.BytesIO()
fig.savefig(buf, format="png", dpi=100)
buf.seek(0)
img = Image.open(buf)

下面说说图片处理过程:我使用的是QLabel来展示图片,这就需要图片数据类型类型是PyQt5.QtGui.QImage。经常使用下面的代码来展示:

image = QImage(img.data, img.shape[1], img.shape[0], QImage.Format_RGB888)
label.setPixmap(QPixmap.fromImage(image))

其中的img必须是numpy.ndarray类型的,但目前我们获得的img是PIL.PngImagePlugin.PngImageFile类型的。我们可以使用img = numpy.asarray(img)来进行转换,这样就可以使用上面的代码进行展示了。

img = Image.open(buf)
img = np.asarray(img)
image = QImage(img.data, img.shape[1], img.shape[0], QImage.Format_RGB888)
label.setPixmap(QPixmap.fromImage(image))

奇怪的是不知道为什么,通过这样的方法展示出来的图片却总是损坏的,如下图。
【pyqt5】【多线程】【matplotlib】解决子线程上运行的matplotlib无法在主线程上的UI界面上绘制图形的问题

通过打印查看转换为numpy.ndarray类型后的图片数组发现里面大部分数据都是255,但是将这张图片再转换回PIL类型的数据展示或者使用opencv显示却都没问题,这一度让我束手无策。

直到我发现PIL.PngImagePlugin.PngImageFile类型的图片可以使用PIL.ImageQt直接转换为QImage类型进行展示,通过如下代码:

image = ImageQt.ImageQt(img1)
label.setPixmap(QPixmap.fromImage(image))

ok,到这里我的问题就解决啦!最终在UI界面得到了如下效果。
【pyqt5】【多线程】【matplotlib】解决子线程上运行的matplotlib无法在主线程上的UI界面上绘制图形的问题文章来源地址https://www.toymoban.com/news/detail-478712.html

到了这里,关于【pyqt5】【多线程】【matplotlib】解决子线程上运行的matplotlib无法在主线程上的UI界面上绘制图形的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pyqt5 如何终止正在执行的线程?

    在 PyQt5 中终止正在执行的线程,可以通过一些协调的方法来实现。一般情况下,直接强行终止线程是不安全的,可能会导致资源泄漏或者程序异常。相反,我们可以使用一种协作的方式,通知线程在合适的时候自行退出。 以下是一种常见的方法,使用标志位来通知线程停止

    2024年02月14日
    浏览(41)
  • Pyqt5实现新线程更新窗口UI

    我们用pyqt5开发窗口应用时,应用会执行一些耗时的操作,如复制大量文件,下载大量数据等。一般情况下,在这些操作没有完成时,窗口的UI处于“假死”状态,不会更新,只有所有操作完成后,窗口的状态才会更新。这样对用户使用非常不友好。 使用多线程技术,在新线

    2024年02月13日
    浏览(45)
  • PyQt5学习笔记--多线程处理、数据交互

    目录 1--引入多线程的原因 2--PyQt多线程的基本知识 3--多线程登录程序的实例 4--参考 ① 如果Qt只采用单线程任务的方式,当遇到数据处理慢的情形时,会出现GUI卡死的情况。 ② 使用下述例子展示单线程任务的缺陷: ③ 代码: ④ 结果展示: 当点击第一个button时,GUI会出现卡

    2023年04月16日
    浏览(51)
  • PyQt5 多线程和异步刷新UI

    以下简介一个基本的PyQt程序。 需要导入的类主要来自三个包 from PyQt5.QtWidgets import 常用的控件 PyQt5.QtCore 核心功能类,如QT,QThread,pyqtSignal PyQt5.QtGui UI类,如QFont 基础的程序结构: 注意: 使用join方法会让主线程阻塞在这里,等待子线程结束,在里面可以设置阻塞的时间 a

    2024年02月11日
    浏览(41)
  • 【PyQt5实现多线程更新UI】- 提高程序效率,优化用户体验

    【PyQt5实现多线程更新UI】- 提高程序效率,优化用户体验 在PyQt5应用程序的开发中,当程序需要处理大量数据或进行复杂的计算时,如果仅使用主线程,会导致GUI界面失去响应,用户体验较差。为了解决这个问题,通常需要使用多线程技术。 而在使用多线程时,往往需要更新

    2024年02月07日
    浏览(34)
  • PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

    目录 1--前言 2--基于Qt Designer设计ui文件 3--视频的编解码操作 4--完整代码 5--结果展示 6--存在的问题 7--参考 ① 创建两个线程, 主线程 为ui线程, 子线程 用于读取摄像头视频,将处理后的图像帧数据(处理操作可以人为添加)返回到主线程进行可视化; ② 子线程向主线程传

    2023年04月09日
    浏览(49)
  • RAMMAP(运行内存清理工具)自动释放内存,并利用pyqt5制作图形界面

    上一篇文章用python制作了一个自动清理内存的程序,利用cmd端口调用Rammap,不过只是做了一个托盘图标,这回用pyqt5做一个简单的图形界面,并实现对自动清理模式的一些设置 首先利用pyqt5工具qt designer生成UI界面,这里命名为F_UI.ui(并利用信号/槽编辑器将滑动条和微调框绑

    2024年02月11日
    浏览(50)
  • 解决---设备“VMnet0”上的网桥没有运行。该虚拟机无法与此主机或网络上的其他主机进行通信。 无法连接虚拟设备“Ethernet0”。

    quad quad 由于之前安装过VMware,但是卸载后从新安装导致 虚拟机 的虚拟网络编辑器没有桥接模式,即只有 网络适配器 网络类型 VMnet1 Host-only(仅主机) VMnet8 NAT quad quad 这导致 你所安装的虚拟机( 如 Ubuntu) 就不能与你的电脑再同一个网段,也就是虚拟机与你的电脑不能够

    2024年02月01日
    浏览(68)
  • 安装pyqt5遇到的问题(已解决)

    打算安装pyqt5,然后pip install PyQt5 报错: Command \\\"g:python3.7python.exe g:python3.7libsite-packagespip install --ignore-installed --no-user --prefix C:Users用户AppDataLocalTemppip-build-env-o2fimxzioverlay --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- \\\"sip =6.4, 7\\\" \\\"PyQt-builder =1

    2024年02月04日
    浏览(33)
  • Anaconda Prompt使用pip安装PyQt5-tools后无法打开Spyder或闪退

     艹!MLGBZD! 真TMD折腾人! 出现原因: 首次安装完Anaconda3-2023.07-1-Windows-x86_64.exe后首次打开Spyder,此时是没有问题的,然后打开Anaconda Prompt,查看有哪些包,pip list 这时候开始首次安装第1个 库:pip install PyQt5-tools 安装完之后去打开Spyder就出现了开始的那一幕了! 打不开!打

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包