import sys import time import numpy as np from matplotlib.backends.qt_compat import QtCore, QtWidgets from matplotlib.backends.backend_qt5agg import (FigureCanvas, NavigationToolbar2QT as NavigationToolbar) from matplotlib.figure import Figure from protocol.Celery.MBTCPMaster import app as MBTCPMApp from celery.result import AsyncResult from utils.Queue import Queue from model.ProjectModel.VarManage import ModbusVarManage class ActualTrend(QtWidgets.QMainWindow): def __init__(self, parent=None, varName = None): super(ActualTrend, self).__init__(parent) self.varName = varName _main = QtWidgets.QWidget() self.setCentralWidget(_main) layout = QtWidgets.QVBoxLayout(_main) dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3))) layout.addWidget(dynamic_canvas) self.addToolBar(QtCore.Qt.BottomToolBarArea, NavigationToolbar(dynamic_canvas, self)) self.x = [] #建立空的x轴数组和y轴数组 self.y = [] self.xQueue = Queue(length = 20) self.yQueue = Queue(length = 20) # self.n = 0 self._dynamic_ax = dynamic_canvas.figure.subplots() self._timer = dynamic_canvas.new_timer( 1000, [(self._update_canvas, (), {})]) self._timer.start() def _update_canvas(self): # self.n += 1 varName = self.varName varMM = ModbusVarManage.getByName(varName) self._dynamic_ax.clear() acttime = time.strftime('%H:%M:%S', time.localtime(time.time())) # print(acttime) if varName != '': if MBTCPMApp.backend.get('ModBus') is not None: uid = MBTCPMApp.backend.get('ModBus').decode('utf-8') else: return # print(uid) res = AsyncResult(uid) # 参数为task id if res.result: # print(res.result, res.date_done) try: yValue = (res.result[varName]) self.yQueue.enqueue(yValue) self.xQueue.enqueue(acttime) except Exception as e: print(e) if not varMM[-2] and not varMM[-1]: minY = min(self.yQueue.list) - 5 maxY = max(self.yQueue.list) + 5 else: minY = float(varMM[-2]) - float(5) maxY = float(varMM[-1]) + float(5) name_list = self.xQueue.list value_list = np.array(self.yQueue.list) pos_list = np.arange(len(name_list)) self._dynamic_ax.set_xticks(pos_list) self._dynamic_ax.set_xticklabels(name_list) self._dynamic_ax.plot(pos_list, value_list, 'bo-', linewidth=2) # self._dynamic_ax.set_xlim(0,10) self._dynamic_ax.set_ylim(minY, maxY) # print(id(self._dynamic_ax)) self._dynamic_ax.figure.canvas.draw() def closeEvent(self, event): # 判断是否点击了窗口的关闭按钮 if event.type() == event.Close: self._timer.stop() self.hide() def showEvent(self, event): self._timer.start() if __name__ == "__main__": qapp = QtWidgets.QApplication(sys.argv) app = ActualTrend() app.show() qapp.exec_()