使用Qt Designer 结合pyqt5与matplotlib

原文链接: https://yapayzekalabs.blogspot.com/2018/11/pyqt5-gui-qt-designer-matplotlib.html
Chrome翻译插件显示原文是土耳其语, 可以利用google网页翻译翻译成英语, 还是比较通顺的. 这里帮助一下英语不太好的同学.

1.0 环境配置

需求依赖: matplotlib, Pyqt5, Qt Designer, Python3

步骤 1.1 GUI搭建

使用QT designer 搭建一个GUI 示例如下
创建一个 Main Window
创建一个 Main Window, 里面塞一个 Widget 和 一个Pushbutton

步骤 1.2 将组建转换为mplWidget(名称为自定义python文件, 下面会解释)

在这里插入图片描述
如上图所示, 选中Widget之后右键选择Promote to, 之后会弹出一个窗口
在这里插入图片描述
点击Promoted class name, 输入你想要的名字(这里作者写的是MplWidget).
然后点击Add按钮.
在这里插入图片描述
然后下一步如上图所示, 选中MplWidget之后打钩, 点击Promote, 组建更新就完成了.
然后再点击保存或者按Ctrl+S 就可以获得由Qt Designer程序生成的.ui文件.

2.0 Python代码部分

首先 全部的项目需要三个文件, 分别是

  1. main.py 程序的主入口, 渲染GUI的代码
  2. mplWidget.py Matplotlib模块的部分 QT Designer会使用的代码
  3. qt_designer.ui 由Qt Designer生成的ui文件

步骤2.1 mplwidget.py 部分( 2020 9 14更新 经过测试这个组件的文件名必须要和步骤1.2最后一张图的hedafile部分的.h文件之前的名字一模一样(大小写敏感), 如果不这样可能编译器无法找到对应的py文件进行组件编译 感谢@dutwzc的评论)

# ------------------------------------------------- ----- 
# -------------------- mplwidget.py -------------------- 
# -------------------------------------------------- ---- 
from  PyQt5.QtWidgets  import * 
from  matplotlib.backends.backend_qt5agg  import  FigureCanvas 
from  matplotlib.figure  import  Figure 

    
class  MplWidget ( QWidget ): 
    def  __init__ ( self ,  parent  =  None ): 
        QWidget . __init__ ( self ,  parent )
        self . canvas  =  FigureCanvas ( Figure ()) 
        
        vertical_layout  =  QVBoxLayout () 
        vertical_layout . addWidget ( self . canvas ) 
        
        self . canvas . axes  =  self . canvas . figure . add_subplot ( 111 ) 
        self . setLayout ( vertical_layout )

代码比较简单就不一一解释了 有几个注意点

  1. 如果说第二个import报错的话, 就换成下面这样
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  1. QVBoxLayout 是可以换成其他的layout的

步骤 2.2 main.py部分

# ------------------------------------------------- ----- 
# ---------------------- main.py ------------------- ---- 
# --------------------------------------------- --------- 
from  PyQt5.QtWidgets  import * 
from  PyQt5.uic  import  loadUi 

from  matplotlib.backends.backend_qt5agg  import  ( NavigationToolbar2QT  as  NavigationToolbar ) 

import  numpy  as  np 
import  random 
     
class  MatplotlibWidget ( QMainWindow ): 
    
    def  __init__ ( self ) :
        
        QMainWindow . __init__ ( self ) 

        loadUi ( "qt_designer.ui" , self ) 

        self . setWindowTitle ( "PyQt5 & Matplotlib Example GUI" ) 

        self . pushButton_generate_random_signal . clicked . connect ( self . update_graph ) 

        self . addToolBar ( NavigationToolbar ( self . MplWidget . canvas ,  self )) 


    def  update_graph( self ): 

        fs  =  500 
        f  =  random . randint ( 1 ,  100 ) 
        ts  =  1 / fs 
        length_of_signal  =  100 
        t  =  np . linspace ( 0 , 1 , length_of_signal ) 
        
        cosinus_signal  =  np . cos ( 2 * np . pi * f * t ) 
        sinus_signal  = np . sin ( 2 * np . pi * f * t ) 

        self . MplWidget . canvas . axes . clear () 
        self . MplWidget . canvas . axes . plot ( t ,  cosinus_signal ) 
        self . MplWidget . canvas . axes . plot ( t ,  sinus_signal ) 
        self .MplWidget . canvas . axes . legend (( 'cosinus' ,  'sinus' ), loc = 'upper right' ) 
        self . MplWidget . canvas . axes . set_title ( ' Cosinus - Sinus Signal' ) 
        self . MplWidget . canvas . draw () 
        

app  =  QApplication ([]) 
window  =  MatplotlibWidget () 
window . show () 
app. exec_ ()

主要由一个类两个函数组成. 第一个函数__init()__就是初始化函数, 主要作用就是渲染UI并初始化组建. (话说我是第一次知道PyQt5.uic这个东西, 以后研究研究, 争取早日告别PyUIC)

注意这个self.pushButton_generate_random_signal 这个变量必须和Qt Designer里的pushbutton按钮名字一致, 如果想要照抄代码记得去QT Designer里把按钮的名字改掉. 当然也可以改成你喜欢的名字.

第二个函数update_graph( self ) 主要是示例, 可以根据自己的需要修改, 这个函数主要功能是实现随机生成信号.

最后的效果就是这样在这里插入图片描述

  • 12
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
主要是为了写个代码,以后用得着时可以直接调用,文件里的类直接继承QWidget,可以作为部件放入Layout中,省的以后还要麻烦重复的写代码。本人气象行业,会用到地图叠加风羽。 ---------- 主要实现了以下功能: 1. 绘制正常的折线或散点图(可以多条折线) 2. 绘制色斑图(等高线图) 3. 将数组显示为图片(主要是自己要用于卫星云图显示) 4. 利用basemap,在地图地图上添加风羽(风杆) ---------- 暂时先实现这些功能,方便再写界面的时候直接调用。basemap没有python3.6版本的,所以用的是非官方包。 文件说明: 一、总体说明 A、类 文件里分为两个类:PlotWidget和PlotGeoWidget文件里分为两个类:```PlotWidget```和```PlotGeoWidget``` B、用到的库 1、matplotlib(2.0.2) 2、PyQt5(5.6) 3、basement(第三方非官方包) 4、numpy(1.14.5) 5、math(python自带) 二、PlotWidget类 A、描述 该类作为一个独立的QWidget部件,可以直接放入Layout中作为一个普通部件 B、方法 1、plot_lines 功能:绘制线型图像(可多条曲线) ```def plot_lines(self, x_data, y_data, xlim=None, ylim=None, linestyle=['-'], linewidth=[2], linecolor=['black'], xticks=None, xlabels=None, x_labels_rotation=0, x_labels_fontsize=20, yticks=None, ylabels=None, y_labels_rotation=0, y_labels_fontsize=20, x_name=None, y_name=None, title=None, label=[None], label_loc='upper right')``` 参数解释: x_data、y_data: 要画的数据 必须在数据外面再套一个[],应为可能会容纳多组数据 例如只有一组数据[1,2,3,4,5],也需要在外面加上[]变成[[1,2,3,4,5]] xlim、ylim: 坐标轴范围,元组类型 例如:(0,100) linestyle、linewidth、linecolor: 线型线宽线色,列表 列表里每个元素都是按照matplotlib的线型线宽线色来表示 xticks、yticks: 坐标轴上要显示的刻度位置,列表类型 例如:[0,10,20,30] 代表在只显示10 20 30的刻度 xlabels、ylabels: 坐标轴上显示刻度位置要显示的文字,列表类型 前提是必须有xticks、yticks 例如:当xticks=[0,10,20,30]时,xlabels=['x', 'xx', 'xxx', 'xxxx']代表在0 10 20 30 刻度处显示'x', 'xx', 'xxx', 'xxxx'文字 x_labels_rotation、x_labels_fontsize、y_labels_rotation、y_labels_fontsize: 坐标轴上文字旋转角度和文字大小 x_name、y_name: 坐标轴标注 title: 图片题名 label: 图注,列表类型 label_loc: 图注位置,按照matplotlib图注规范 2、plot_contour 功能:画等值线图 ```def plot_contour(self, x_data, y_data, val, title=None, x_name=None, y_name=None, xticks=None, xlabels=None, x_labels_rotation=0, x_labels_fontsize=20, yticks=None, ylabels=None, y_labels_rotation=0, y_labels_fontsize=20)``` 参数解释: x_data、y_data、val: 要画的数据(x,y,z值) title: 图片题名 x_name、y_name: 坐标轴标注 xticks、yticks: 坐标轴上要显示的刻度位置,列表类型 xlabels、ylabels: 坐标轴上显示刻度位置要显示的文字,列表类型 x_labels_rotation、x_labels_fontsize、y_labels_rotation、y_labels_fontsize: 坐标轴上文字旋转角度和文字大小 3、plot_digital_image 功能:显示数字图像,如云图、照片等,但是需要先将图片转为数组 ```def plot_digital_image(self, img)``` 参数解释: img: 图片的数组 三、PlotGeoWidget A、描述 该类作为一个独立的QWidget部件,可以直接放入Layout中作为一个普通部件 B、方法 1、map_wind 功能:显示本场周边地区地图,在地图上画出风杆 ```def map_wind(self, lon, lat, spe, dir)``` 参数解释: lon、lat: 经纬度,以小数表示 spe、dir: 风速风向

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值