pyqt内嵌matplotlib_详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)

本文详细介绍了如何在PyQt5 UI中嵌入matplotlib图形,并解决实时刷新的问题。首先,通过导入相关模块,创建自定义的画布类`MyMatplotlibFigure`,并在UI中添加。然后,通过`cla()`方法清除旧图,`plot()`方法绘制新图,配合`draw()`和`flush_events()`实现图像的实时刷新。最后,探讨了使用`FuncAnimation`进行高频刷新的方法,避免闪屏现象。
摘要由CSDN通过智能技术生成

一、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的变量分析中看到“(, TypeError("‘int' object is not callable"), )这是什么鬼?

其实这是一个很简单的错误,但是不小心犯了排查起来很麻烦!!!错误的原因就是有些程序员在自定义类内接收外部传参时经常把传递的参数转换为全局变量,比如这个例子中初始化__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&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值