pyqt显示图片_PyQt——用户界面动态绘图

本文介绍了在PyQt界面中使用matplotlib和pyqtgraph进行动态图像绘制的方法,包括如何解决图像卡顿、坐标轴移动、文字丢失等问题。matplotlib动态绘图存在性能瓶颈,而pyqtgraph则提供了更好的性能和用户体验。文章详细解析了matplotlib的初始化、更新函数和图像绘制,并对比了matplotlib和pyqtgraph的性能差异,最后提供了相关学习资源。
摘要由CSDN通过智能技术生成
在GUI用户界面上绘制实时图像这个问题是在让我头疼了好久,最开始采用Python中最常用的绘图库matplotlib,在用这个库进行动态绘图时遇到了很多问题。遇到的问题如下:
  1. 动态绘图的图像生成期间会导致界面卡顿 >>>> 引入多线程(QT界面涉及到线程安全,是不允许子线程去更改主线程界面中的任何控件状态,所以就导致了很多的麻烦)。

  2. matplotlib会生成静态图后并不能实时更新 >>>> 使用ion,开启matplotlib的动态绘制模式

  3. 图片在绘制过程中会一条一条往上叠加,不会清除原来的曲线 >>>> 一种方案是将图片的hold性质改成False,但是hold属性在较新版本的matplotlib包里面已经删掉了,想要用要回退到以前的版本;另一种方案是在绘图直线执行以下clear操作。

  4. 虽然设置了图坐标轴名称及其他文字内容,但是图片更新的过程中坐标轴会移动,而且文字会丢失 >>>> 这个应该有解决方法,但是没找到。

  5. 测试每次图片更新间隔时间为0.25s左右,也就是说1秒只能更新四张图片 >>>> 无解,狗带。

  6. 图片更新过程中有时会丢失曲线,丢失曲线后报错都是底层包的“list index out of range” >>>> 好像也是无解的。

前面一些问题还能忍,找找办法还能解决。第5点是真的不能忍,绘图更新慢就算了,还会拖累其他子线程的运行速度,这个估计是因为Python多线程并非真正意义上的多线程,底层变量还是相同的。也尝试过想用多进程来代替绘图的多线程,但是多进程还涉及到一个共享变量的问题,太难了,写到一半放弃了。 这个动态绘图前前后后折磨了我一个多月,最后受不来了,推倒重写。重写主要有两个方面:
  • 一个是将原本使用的Python自带多线程Thread替换成QT框架下的QThread,通过信号与槽这样一个机制来向界面主线程发送信息更改界面内容;

  • 另一个是用pyqtgraph库来进行动态绘图,pyqtgraph库是专门用于Qt GUI界面上的图像绘制,主打的就是轻量级的特点。虽然这个库的可参考资料实在不多,很多特性更改都是啃文档和摸索实现的,但是结果是真香!!!!

接下来将matplotlib库和pyqtgraph库写的代码贴出来解释一下,然后再附上每一种的实现 效果动图 。

1. matplotlib实现PyQt界面上的动态绘图

matplotlib动态绘图代码主要分为三个部分:初始化,更新函数,图像绘制。

1.1 界面开启时候的初始化设置

1#画图函数的初始设置
2def drawing_init(self):
3    self.layout = QHBoxLayout(self.label)
4    self.mpl = PlotCanvas(self, width=3, height=9)  # 实例化一个画布对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值