关键技术:变量传递, Pyqt Canvas, 信号槽
定义三种不同的绘图样式:第一个是静态图,第二个是动态图,最后一个是变量可控视图。
sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100)
dc = MyDynamicMplCanvas(self.main_widget, width=5, height=4, dpi=100)
cc = MyControlMplCanvas(self.main_widget, width=5, height=4, dpi=100)
self.horizontalLayout.addWidget(sc)
self.horizontalLayout.addWidget(dc)
self.horizontalLayout.addWidget(cc)
变量传递,通过lambda函数实现。
self.horizontalSlide.valueChanged['int'].connect(lambda: cc.update_figure(self.horizontalSlide.value()))
完整程序:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '.\mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
import sys
import random
import matplotlib
matplotlib.use("Qt5Agg")
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class MyMplCanvas(FigureCanvas):#画布基类
"""这是一个窗口部件,即QWidget(当然也是FigureCanvasAgg)"""
def __init__(self, parent=None, width=50, height=50, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
# 每次plot()调用的时候,我们希望原来的坐标轴被清除(所以False)
self.axes.hold(False)
self.compute_initial_figure()
#
FigureCanvas.__init__(self, fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding,
QSizePolicy.Expanding)
self.axes.set_xlabel('x')
self.axes.set_ylabel('y')
FigureCanvas.updateGeometry(self)
def compute_initial_figure(self):
pass
class MyStaticMplCanvas(MyMplCanvas):#单个画布
"""静态画布:一条正弦线"""
def compute_initial_figure(self):
t = arange(0.0, 3.0, 0.01)
s = sin(4*pi*t)
self.axes.plot(t, s)
class MyControlMplCanvas(MyMplCanvas):#单个画布
"""动态画布:每秒自动更新,更换一条折线。"""
def __init__(self, *args, **kwargs):
MyMplCanvas.__init__(self, *args, **kwargs)
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure)
timer.start(1000)
def compute_initial_figure(self):
self.axes.plot([0, 0, 0, 0], [1, 2, 3, 4], 'r')
def update_figure(self,x=1):
# 构建4个随机整数,位于闭区间[0, 10]
t = arange(0.0, 3.0, 0.01)
print x
s = sin(2*pi*t+x/100.*2*pi)
self.axes.plot(t, s ,'r')
self.axes.set_xlabel('x')
self.axes.set_ylabel('y')
self.draw()
class MyDynamicMplCanvas(MyMplCanvas):#单个画布
"""动态画布:每秒自动更新,更换一条折线。"""
def __init__(self, *args, **kwargs):
MyMplCanvas.__init__(self, *args, **kwargs)
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure)
timer.start(1000)
def compute_initial_figure(self):
self.axes.plot([0, 1, 2, 3], [1, 2, 0, 4], 'r')
def update_figure(self):
# 构建4个随机整数,位于闭区间