环境:Eric6+Qt5.7+PyQt5.7 Ubuntu18.04
安装方法请看我之前的博客,之所以在ubuntu下开发,因为大部分服务器都使用Linux系统,因此在windows下编写的各种程序适用范围较窄,而且最终还是要迁移到linux上去。文中尽量隐去大量的术语,用比较浅显易懂的语言来描述。照顾刚接触python编程的朋友。
我们开始前需要用PIP3安装一个库,Matplotlab。这个是一个著名的Python图形库。可以做出各式各样的图表。
pip3 install matplotlib
我们进入eric6,建立项目,使用Qt desinger设计界面。上面两例都有详细的步骤,不赘述了。建立一个 Main Window。
加入两个按钮控件和一个widget窗体部件,并将按钮控件标签改为:start,stop。
右击widget控件,选择Promoted widgets... 进行提升。
在弹出的对话框里 Base class name 选择Qwidget 其他的照下图填写,class name其实可以随便起的,但是要和之后建立的文件相对应。然后选择add加入。出现下图上半部分的结果即可,最后Promote提交。
做完后将其保存并导入项目。
下面我们建立一个刚才导入同名的文件:Matplotlibwidget.py 并将其导入项目。顺便生成下按钮单击的事件也就是文件 lesson3.py 。(怎么生成往前面的章节翻)
最后的结果应该如下图所示。
前期操作结束,下面我们开始编写Matplotlibwidget.py文件。我们所有绘图的工作都在这里完成。可以看成一个绘图的母版。我们着重讲讲这个母版。下面是文件的源代码。
import sys
import matplotlib #导入matplotlib
matplotlib.use("Qt5Agg") #声明 matplotlib 使用的是Qt5的库
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtCore import QTimer #为了后面加载的计时器控件
import random #随机数
import numpy as np #matplotlib 使用 numpy 进行数组运算 因为numpy太长了 取别名为np
import matplotlib.pyplot as plt #这个是最重要的画图控件
from scipy import interpolate #导入差值,后面用的到。
class MyMplCanvas(FigureCanvas):
#MyMplCanvas 继承了FigureCanvas类,主要用来连接Pyqt与matplotlib。
def __init__(self, parent=None, width=5, height=4, dpi=100):
self.fig = plt.Figure(figsize=(width, height), dpi=dpi)
#建立figure类的对象 flg, Figure可以看做一个画板,所有的图都要画在画板上。
self.axes = self.fig.add_subplot(111)
#建立对象 axes 这里的 (111)其实是切分图形的方法,可以将一个画板下分隔出很多的小作图区。我们后面详细说
FigureCanvas.__init__(self, self.fig) #将父类初始化
self.setParent(parent)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
#这个主要是将后端的绘图功能同Qt的布局管理器衔接上。以免出现布局上的错误。简单的说,就是widget大的时候,图就大,widget小的时候图就跟着小。实时变化要跟下面的代码同时使用。
FigureCanvas.updateGeometry(self)
#这个updateGeometry 主要是在widget有改变的时候,绘图跟着改变。不然你widget拖大了,绘图还是那么小。。。
class Matplotlibwidget(QWidget):
# 定义Matplotlibwidget类继承了QWidget类,绘图的主代码写在这个类里。
def __init__(self, parent=None):
#不指定父子类关系,布局管理器统一管理。
super(Matplotlibwidget, self).__init__(parent) #继承父类
self.initUi()
def initUi(self): #对绘制的图形进行布局,并生成MyMplCanvas对象。
self.layout = QVBoxLayout(self)
self.mpl = MyMplCanvas(self, width=15, height=15, dpi=100)
self.layout.addWidget(self.mpl)
def plot(self): #网上抄的画图,两条曲线。
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
# X是一个数组,从 -3.14 到 +3.14 一共有256个取值点的等差数组,用linspace实现。endpoint是否包含终值。
C, S=np.cos(X), np.sin(X)
# 计算cos 和 sin 的值分别将其插入X数组中,形成新的数组用来定义Y轴。
self.mpl.axes.plot(X,C) #生成COS图
self.mpl.axes.plot(X,S) #生成SIN图
self.mpl.draw() 将图形输出到界面上
def clear_plot(self):
self.mpl.axes.cla() #清除全部绘图
self.mpl.draw() #将清除后的图输出到界面。
最后把两个函数绑定到两个按钮上。写上启动代码在lesson3.py里。并将项目配置里的主脚本设置为 lesson3.py。
代码大概是这样
执行后 点击start 绘制图形,stop 清空。