使用pyQt创建GUI进行绘图

环境配置

安装

在python环境中使用pip安装PyQt5PyQt5-tools

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5-tools
Pycharm配置

启动pycharm后新建一个项目,打开File->Setting->Tools->External Tools->(+)创建一个外部工具。其中工具名称可以填写其他的,有辨识度即可,Programs可以在Python_path/Lib/site_packages/...里面搜索找到designer.exe的位置,复制到这里即可。

大致应该在类似这样的目录下:

D:\anaconda3\Lib\site-packages\qt5_applications\Qt\bin

Working directory的地方设置为$FileDir$,每次打开这个工具即可定位到项目的目录下。这个工具可以直接在PyCharm里面打开Qt Designer

微信截图_20210519104245

按照同样的方法,设置另外一个工具PyUIC,其中Program直接设置为python.exe即可,Arguments需要设置为-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.pyWorking directory的地方设置为$FileDir$

微信截图_20210519104839

配置完成以后,右击项目名称找到External Tools能看到刚才设置的两个工具,也可以通过Tools->External Tools找到,如果没有的话,重启Pycharm即可。

QQ截图20210519105549

设计GUI

打开一个QtDesigner,即可自己设计一个GUI界面。如果类似matplotlib的绘图控件,需要拉一个Widget控件,简单拉了一个Widget控件和一个按钮。然后进行保存,文件保存的后缀为.ui。需要将.ui文件转化为.py文件。这里只需要将External ToolsPyUIC运行一下即可。出现了如下信息即表示转化成功。在项目下也可以看到GUI.pygui.ui两个文件。

path_for_python\python.exe -m PyQt5.uic.pyuic GUI.ui -o GUI.py
Process finished with exit code 0

微信截图_20210519110211

在GUI中绘图

每一次运行QtDesigner修改了UI后,都需要通过PyUIC转换为新的.py文件,都会覆盖掉我们自己的代码,所以一般新建一个新的文件来写入自己的代码。

matplotlib作图嵌入PyQt界面的关键在于需要创建一个图形类,通过继承FigureCanvas类,使其相当于PyQt里的控件,从而完成PyQt与Matlibplot的结合。

class Myplot(FigureCanvas):
  def __init__(self, width=5, height=3, dpi=100):
    self.fig = Figure(figsize=(width, height), dpi=dpi)
    FigureCanvas.__init__(self, self.fig)
    self.axes= self.fig.add_subplot(111)
    self.compute_initial_figure()
 
  def compute_initial_figure(self):
    pass

对于按钮控件的相应函数需要写一个on_xxx_clicked的函数。

    @pyqtSlot()
    def on_pushButton_clicked(self):
        x = [i for i in range(100)]
        self.plot_ctrl_canvas.axes.plot(x)
        self.plot_ctrl_canvas.draw()

创建的新文件整体代码如下:

# encoding: utf-8
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QMainWindow, QGridLayout
from PyQt5.QtCore import QTimer, pyqtSlot, QThread
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
import sys, random, time, os, re
from GUI import Ui_MainWindow


class Myplot(FigureCanvas):
    def __init__(self, width=5, height=3, dpi=100):
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        FigureCanvas.__init__(self, self.fig)
        self.axes = self.fig.add_subplot(111)
        self.compute_initial_figure()

    def compute_initial_figure(self):
        pass


class AppWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(AppWindow, self).__init__(parent)
        self.setupUi(self)

        self.plot_ctrl_canvas = Myplot()
        self.gridlayout1 = QGridLayout(self.plot_ctrl)
        self.gridlayout1.addWidget(self.plot_ctrl_canvas)

        show_bar = True
        if show_bar:
            self.fig_ntb1 = NavigationToolbar(self.plot_ctrl_canvas, self)
            self.gridlayout1.addWidget(self.fig_ntb1)

    @pyqtSlot()
    def on_pushButton_clicked(self):
        x = [i for i in range(100)]
        self.plot_ctrl_canvas.axes.plot(x)
        self.plot_ctrl_canvas.draw()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = AppWindow()
    win.show()
    sys.exit(app.exec_())

微信截图_20210519113159

绘图的基本操作
  • 创建一个Myplot对象并绑定控件
        self.plot_ctrl_canvas = Myplot()
        self.gridlayout1 = QGridLayout(self.plot_ctrl)
        self.gridlayout1.addWidget(self.plot_ctrl_canvas)
    
  • 显示matplotlib的工具栏
        self.fig_ntb1 = NavigationToolbar(self.plot_ctrl_canvas, self)
        self.gridlayout1.addWidget(self.fig_ntb1)
    
  • 在plot后需要调用draw方法更新。
        self.plot_ctrl_canvas.axes.plot(x)
        self.plot_ctrl_canvas.draw()
    
  • 其他:
        self.plot_ctrl_canvas.axes.cla() # 清除绘图
        self.plot_ctrl_canvas.axes.set_title(title,fontsize=18,color='c')# 设置绘图标题
        self.plot_ctrl_canvas.axes.set_xlabel("delay(s)",fontsize=18,color='c') # 设置x轴标签
        self.plot_ctrl_canvas.axes.set_ylabel("counts",fontsize=18,color='c') # 设置y轴标签
    

PyQt的控件操作

  • 状态栏设置文字:self.statusbar.showMessage('Init Component Ready')
  • 菜单栏设置相应函数:self.actionAbout_Me.triggered.connect(self.show_about)
  • 常见MessageBox:
        def show_about(self):
        QtWidgets.QMessageBox.about(self, "About", """软件描述""")
    

代码可在csdn Download进行下载。

参考

  1. PyQt完整入门教程,https://www.cnblogs.com/lovesoo/p/12491361.html
  2. 利用PyQt5+Matplotlib 绘制静态/动态图的实现代码,https://www.jb51.net/article/190649.htm
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值