解决matplotlib嵌入PyQt5画图时的图片刷新问题

编程入门 行业动态 更新时间:2024-10-23 18:31:03

解决matplotlib嵌入PyQt5<a href=https://www.elefans.com/category/jswz/34/1769620.html style=画图时的图片刷新问题"/>

解决matplotlib嵌入PyQt5画图时的图片刷新问题

解决matplotlib嵌入PyQt5画图时的图片刷新问题(1)

matplotlib画图可以嵌入到PyQt5控件TabWidget、GroupBox和QGraphicsView视图窗口显示图形。当重新画图时,需要在当前窗口显示重新画好的图。

在网上可以查到很多相关的资料和答案,但有些杂乱并且还是耗费了很多时间,问题解决后就记录一下解决这一问题的过程和代码示例。
matplotlib嵌入PyQt5画图
在这篇博文中(原文链接:),博主详细讲了如何把matplotlib嵌入PyQt5画图。下图是评论区的截图,都在讨论如何刷新图片,给出了解决方案,也是很多答案中的一种。但是在我的工作中并没work。

解决图片刷新问题
做一个简单的例子来说明一下解决方案。在goupBox中切换sin和cos图。
首先,绘制GUI,如下图。选择comBox中的值,以改变cos图的形状。实现在groupBox中显示不同的cos图。
先附上完整代码,在说明讲解。
以下是完整代码。

import numpy as np
import sys
from PyQt5 import QtWidgets 
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib
import matplotlib.pyplot as plt
import sip
matplotlib.use("Qt5Agg")  # 声明使用QT5
class MyFigure(FigureCanvas):def __init__(self, width=8, height=2,dpi=100):# 第一步:创建一个创建Figureself.fig = Figure(figsize=(width, height), dpi=dpi)super(MyFigure, self).__init__(self.fig)self.ax=self.fig.add_subplot(111)class Stats:step = 0def __init__(self):# 从文件中加载UI定义self.ui = uic.loadUi(".../csdn.ui")self.ui.pushButton.clicked.connect(self.plotcos)self.verticalLayout_1 = QtWidgets.QVBoxLayout(self.ui.groupBox)self.verticalLayout_1.setContentsMargins(0, 0, 0, 0)self.verticalLayout_1.setObjectName("verticalLayout_1")def myfunction(self):self.F = MyFigure(width=3, height=2, dpi=100)t = np.arange(0.0, int(self.uiboBox.currentText()), 0.01)s = np.cos(2 * np.pi * t)self.F.ax.plot(t, s)  if self.verticalLayout_1.count() < 2: self.verticalLayout_1.addWidget(self.F) def plotcos(self):self.step += 1if self.step == 1:self.myfunction()else:sip.delete(self.F)self.myfunction()       if __name__ == '__main__':app = QApplication([])stats = Stats()stats.ui.show()sys.exit(app.exec_())

动态加载.ui文件,代码如下。

from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
import sys
class Stats:def __init__(self):# 从文件中加载UI定义self.ui = uic.loadUi(".../csdn.ui")
if __name__ == '__main__':app = QApplication([])stats = Stats()stats.ui.show()sys.exit(app.exec_())

首先,把matplotlib嵌入PyQt5。matplotlib.use("Qt5Agg") # 声明使用QT5,这段声明很重要。接着创建画图的类。这部分资源在网上很多,而且都比较统一固定。

class MyFigure(FigureCanvas):def __init__(self, width=8, height=2,dpi=100):# 第一步:创建一个创建Figureself.fig = Figure(figsize=(width, height), dpi=dpi)super(MyFigure, self).__init__(self.fig)self.ax=self.fig.add_subplot(111)

其次,就是给显示图片的控件添加布局来布局图片这一“控件”(理解这个很重要,也是很基础的东西)

self.verticalLayout_1 = QtWidgets.QVBoxLayout(self.ui.groupBox)self.verticalLayout_1.setContentsMargins(0, 0, 0, 0)self.verticalLayout_1.setObjectName("verticalLayout_1")

最后,刷新图片的最重要的操作、最有效地操作就是下面这段代码。sip.delete(self.F)删除图片“控件”,再来重新画图。step判断是否第一次画图,之前是否已有图片控件存在。

def plotcos(self):self.step += 1if self.step == 1:self.myfunction()else:sip.delete(self.F)self.myfunction()   

参考:

更多推荐

解决matplotlib嵌入PyQt5画图时的图片刷新问题

本文发布于:2024-02-06 23:25:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1751504.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:画图   图片   matplotlib

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!