PYQT5+matplotlib+QtDesigner matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)

https://blog.csdn.net/panrenlong/article/details/80183519?ops_request_misc=&request_id=&biz_id=102&utm_term=python%20matplotlib%20%E5%9C%A8%E6%8E%A7%E4%BB%B6%E6%98%BE%E7%A4%BA&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-80183519.first_rank_v2_pc_rank_v29_10

感谢这位大佬的文章,解决了困扰我许久的难题!!!
站在巨人肩膀,在此之上,添加一些给小白(我自己)的更通俗的说明。最好跟上面的文章对比着看。
原文章是在QtDesigner中的”Dialog”类型的界面中的控件上 显示matplotlib曲线绘图,此时我想更改为使用”MainWindow”类型的界面进行显示

PYQT5+matplotlib+QtDesigner  matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)
PYQT5+matplotlib+QtDesigner  matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)

; 采用Main Window类型界面进行显示

我将原文章的部分代码进行修改,方便对比查看

  • 原文章中的模块区域 testplot2pyqt5 这个是QtDesigner设计好的ui文件转py文件后的名字,根据自己的ui文件转py文件的名字更改即可。方便对比关键区域,我这里都没有更改。
  • 将QtDesigner设计出来的ui文件转py文件,网上教程很多,我用的是Pycharm中的自己加上的PyUic的插件(也是网上的教程),有兴趣大家可以去查一下。

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import numpy as np

from testplot2pyqt5ui import Ui_MainWindow

import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

class MyFigure(FigureCanvas):
    def __init__(self,width=5, height=4, dpi=100):

        self.fig = Figure(figsize=(width, height), dpi=dpi)

        super(MyFigure,self).__init__(self.fig)

        self.axes = self.fig.add_subplot(111)

    def plotsin(self):
        self.axes0 = self.fig.add_subplot(111)
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes0.plot(t, s)
    def plotcos(self):
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes.plot(t, s)

class MainDialogImgBW(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(MainDialogImgBW,self).__init__()
        self.setupUi(self)
        self.setWindowTitle("显示matplotlib绘制图形")
        self.setMinimumSize(0,0)

        self.F = MyFigure(width=3, height=2, dpi=100)

        self.plotcos()

        self.gridlayout = QGridLayout(self.groupBox)
        self.gridlayout.addWidget(self.F,0,1)

        self.plotother()

    def plotcos(self):
        t = np.arange(0.0, 5.0, 0.01)
        s = np.cos(2 * np.pi * t)
        self.F.axes.plot(t, s)
        self.F.fig.suptitle("cos")
    def plotother(self):
        F1 = MyFigure(width=5, height=4, dpi=100)
        F1.fig.suptitle("Figuer_4")
        F1.axes1 = F1.fig.add_subplot(221)
        x = np.arange(0, 50)
        y = np.random.rand(50)
        F1.axes1.hist(y, bins=50)
        F1.axes1.plot(x, y)
        F1.axes1.bar(x, y)
        F1.axes1.set_title("hist")
        F1.axes2 = F1.fig.add_subplot(222)

        x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        y = [23, 21, 32, 13, 3, 132, 13, 3, 1]
        F1.axes2.plot(x, y)
        F1.axes2.set_title("line")

        F1.axes3 = F1.fig.add_subplot(223)
        F1.axes3.scatter(np.random.rand(20), np.random.rand(20))
        F1.axes3.set_title("scatter")

        F1.axes4 = F1.fig.add_subplot(224)
        x = np.arange(0, 5, 0.1)
        F1.axes4.plot(x, np.sin(x), x, np.cos(x))
        F1.axes4.set_title("sincos")
        self.gridlayout.addWidget(F1, 0, 2)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainDialogImgBW()
    main.show()

    sys.exit(app.exec_())

更换为Main Window界面类型的代码仅更改两处,如果想换为Widget类型界面显示,我猜应该差不多。

Main Window类型界面+动态加载ui界面


from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import numpy as np

import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

from PyQt5 import uic

class MyFigure(FigureCanvas):
    def __init__(self,width=5, height=4, dpi=100):

        self.fig = Figure(figsize=(width, height), dpi=dpi)

        super(MyFigure,self).__init__(self.fig)

        self.axes = self.fig.add_subplot(111)

    def plotsin(self):
        self.axes0 = self.fig.add_subplot(111)
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes0.plot(t, s)
    def plotcos(self):
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes.plot(t, s)

class MainDialogImgBW():
    def __init__(self):
        super(MainDialogImgBW,self).__init__()

        self.ui = uic.loadUi('testplot2pyqt5ui.ui')

        self.ui.setWindowTitle("显示matplotlib绘制图形")
        self.ui.setMinimumSize(0,0)

        self.F = MyFigure(width=3, height=2, dpi=100)

        self.plotcos()

        self.gridlayout = QGridLayout(self.ui.groupBox)
        self.gridlayout.addWidget(self.F,0,1)

        self.plotother()

    def plotcos(self):
        t = np.arange(0.0, 5.0, 0.01)
        s = np.cos(2 * np.pi * t)
        self.F.axes.plot(t, s)
        self.F.fig.suptitle("cos")
    def plotother(self):
        F1 = MyFigure(width=5, height=4, dpi=100)
        F1.fig.suptitle("Figuer_4")
        F1.axes1 = F1.fig.add_subplot(221)
        x = np.arange(0, 50)
        y = np.random.rand(50)
        F1.axes1.hist(y, bins=50)
        F1.axes1.plot(x, y)
        F1.axes1.bar(x, y)
        F1.axes1.set_title("hist")
        F1.axes2 = F1.fig.add_subplot(222)

        x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        y = [23, 21, 32, 13, 3, 132, 13, 3, 1]
        F1.axes2.plot(x, y)
        F1.axes2.set_title("line")

        F1.axes3 = F1.fig.add_subplot(223)
        F1.axes3.scatter(np.random.rand(20), np.random.rand(20))
        F1.axes3.set_title("scatter")

        F1.axes4 = F1.fig.add_subplot(224)
        x = np.arange(0, 5, 0.1)
        F1.axes4.plot(x, np.sin(x), x, np.cos(x))
        F1.axes4.set_title("sincos")
        self.gridlayout.addWidget(F1, 0, 2)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainDialogImgBW()

    main.ui.show()

    sys.exit(app.exec_())

QtDesigner界面设计

为了防止有像我一样的小白连QtDesigner也不会用,把界面设置也说一下吧

PYQT5+matplotlib+QtDesigner  matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)
PYQT5+matplotlib+QtDesigner  matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)

PYQT5+matplotlib+QtDesigner  matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)
PYQT5+matplotlib+QtDesigner  matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)

小总结

  • 动态加载ui ,关键是将ui界面的文件load进来,要不他也不知道你的界面长啥样。
from PyQt5 import uic
   self.ui = uic.loadUi('testplot2pyqt5ui.ui')
  • 凡是需要操作界面内的控件或者界面本事的,必须加 “.ui”
self.ui.xxxxxxx(要干的事情)

Original: https://blog.csdn.net/zwy4769/article/details/114778868
Author: 真男人永不秃头
Title: PYQT5+matplotlib+QtDesigner matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/766742/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球