没有合适的资源?快使用搜索试试~ 我知道了~
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
94 下载量 117 浏览量
2020-12-17
06:07:04
上传
评论 8
收藏 100KB PDF 举报
温馨提示
试读
5页
一、pyqt5的UI中嵌入matplotlib的方法 1、导入模块 导入模块比较简单,首先声明使用pyqt5,通过FigureCanvasQTAgg创建画布,可以将画布的图像显示到UI,相当于pyqt5的一个控件,后面的绘图就建立在这个画布上,然后把这个画布当中pyqt5的控件添加到pyqt5的UI上,其次要导入matplotlib.figure的Figure ,这里要注意的是matplotlib.figure中的Figure,不是matplotlib.pyplot模块中的Figure,要区分清楚。 import matplotlib matplotlib.use("Qt5Agg") #
资源推荐
资源详情
资源评论
详解详解pyqt5的的UI中嵌入中嵌入matplotlib图形并实时刷新图形并实时刷新(挖坑和填坑挖坑和填坑)
一、一、pyqt5的的UI中嵌入中嵌入matplotlib的方法的方法
1、导入模块、导入模块
导入模块比较简单,首先声明使用pyqt5,通过FigureCanvasQTAgg创建画布,可以将画布的图像显示到UI,相当于pyqt5的
一个控件,后面的绘图就建立在这个画布上,然后把这个画布当中pyqt5的控件添加到pyqt5的UI上,其次要导入
matplotlib.figure的Figure ,这里要注意的是matplotlib.figure中的Figure,不是matplotlib.pyplot模块中的Figure,要区分清楚。
import matplotlib
matplotlib.use("Qt5Agg") # 声明使用pyqt5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg # pyqt5的画布
import matplotlib.pyplot as plt
# matplotlib.figure 模块提供了顶层的Artist(图中的所有可见元素都是Artist的子类),它包含了所有的plot元素
from matplotlib.figure import Figure
2、创建、创建pyqt5画布,并简单设置样式画布,并简单设置样式
创建一个画布类,继承上面导入的FigureCanvasQTAgg,通过Figure 创建画布,并且作为参数传递给父类
FigureCanvasQTAgg(这里是关键一步!没有这一步后面一切都是白费,不会添加成功!),最后一步添加绘图区self.axes
class MyMatplotlibFigure(FigureCanvasQTAgg):
"""
创建一个画布类,并把画布放到FigureCanvasQTAgg
"""
def __init__(self, width=10, heigh=10, dpi=100):
plt.rcParams['figure.facecolor'] = 'r' # 设置窗体颜色
plt.rcParams['axes.facecolor'] = 'b' # 设置绘图区颜色
self.width = width
self.heigh = heigh
self.dpi = dpi
self.figs = Figure(figsize=(self.width, self.heigh), dpi=self.dpi)
super(MyMatplotlibFigure, self).__init__(self.figs) # 在父类种激活self.fig, 否则不能显示图像
self.axes = self.figs.add_subplot(111)
3、填上创建、填上创建pyqt5画布挖的坑画布挖的坑
上面自定义的画布类MyMatplotlibFigure写的时候不会提示错误,但是当你绘图的时候会傻眼了,因为没有报错但是闪退
了!!!然后逐个把可疑的类和方法try… except … print(er),希望python能告诉你原因,抱歉!最终结果是什么都没有得
到!使用debug单步调试慢慢分析,累死累活的一步一步看到最后添加画布到pyqt5时,跳到一个模块backend_qt5.py文件的
第500行:if self.height() < 0 or self.width() < 0:从debug的变量分析中看到“(<class ‘TypeError’>, TypeError(“‘int’ object is not
callable”), <traceback object at 0x000001C3E0397F08>)这是什么鬼?
其实这是一个很简单的错误,但是不小心犯了排查起来很麻烦!!!错误的原因就是有些程序员在自定义类内接收外部传参时
经常把传递的参数转换为全局变量,比如这个例子中初始化__init__方法接收的三个参数 width、 heigh、 dpi,顺手写了个
self.width = width
self.heigh = heigh
self.dpi = dpi
然后接着调用!问题就在这里了,其实不管你后面有没有调用,都会闪退!!!!!为什么呢?
因为FigureCanvasQTAgg父类中导入了backend_qt5.py模块,而backend_qt5模块内部也使用了相同的变量名self.width和
self.heigh,所以呢,在这里用上面的写法就造成了对父类变量的覆盖。正确的写法:
class MyMatplotlibFigure(FigureCanvasQTAgg):
"""
创建一个画布类,并把画布放到FigureCanvasQTAgg
"""
def __init__(self, width=10, heigh=10, dpi=100):
plt.rcParams['figure.facecolor'] = 'r' # 设置窗体颜色
plt.rcParams['axes.facecolor'] = 'b' # 设置绘图区颜色
# 创建一个Figure,该Figure为matplotlib下的Figure,不是matplotlib.pyplot下面的Figure
# 这里还要注意,width, heigh可以直接调用参数,不能用self.width、self.heigh作为变量获取,因为self.width、self.heigh 在模块中已经
FigureCanvasQTAgg模块中使用,这里定义会造成覆盖
self.figs = Figure(figsize=(width, heigh), dpi=dpi)
super(MyMatplotlibFigure, self).__init__(self.figs) # 在父类种激活self.fig, 否则不能显示图像(就是在画板上放置画布)
self.axes = self.figs.add_subplot(111) # 添加绘图区
这里直接使用传参字符就可以了,这几个参数后面用不到了,如果你能用到就随便改个名字,比如self.w = width self.h =
heigh
4、把画布添加到、把画布添加到pyqt5的的UI中中
资源评论
weixin_38609453
- 粉丝: 9
- 资源: 966
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
- 粒子群算法优化BP神经网络PSO-BP的MATLAB代码(数值预测)
- 基于Springboot的一起看书平台.zip
- 无头单向非循环链表的实现(SList.h)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功