class MPL_Widget(QWidget): def __init__(self, parent = None): QWidget.__init__(self, parent) self.canvas = MyMplCanvas() self.toolbar = NavigationToolbar(self.canvas, self.canvas) #no toolbar self.vbox = QVBoxLayout() self.vbox.addWidget(self.canvas) self.vbox.addWidget(self.toolbar) self.toolbar.hide() self.setLayout(self.vbox)
class BISPlot(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.canvas = SetPlot() self.vbl = QtGui.QVBoxLayout() self.ntb = NavigationToolbar(self.canvas, parent) self.ntb.hide() self.vbl.addWidget(self.ntb) self.vbl.addWidget(self.canvas) self.setLayout(self.vbl) self.flag_Zero = True self.flag_onlinedata = False self.flag_online = False self.flag_offline = False self.dataX_online = [] self.dataY_online = [] self.dataX_offline = [] self.dataY_offline = [] self.offlinedata = [] self.onlinedata = [] self.count_online = 0 self.count_offline = 0 self.count_onlinedata = 0 self.initDataGenerator() def startPlot(self): self.__generating = True def pausePlot(self): self.__generating = False def initDataGenerator(self): self.__generating = False self.__exit = False self.t2 = threading.Thread(target=self.plot_thread) self.t2.start() def releasePlot(self): self.__exit = True self.t2.join() ########################实时plot##################################################### def onlinePlot(self): if self.onlinedata == []: self.DataY_online = 0 self.count_online += 1 self.DataX_online = self.count_online + self.k else: if self.flag_onlinedata: if self.count_onlinedata <= (len(self.onlinedata) - 1): self.DataY_online = self.onlinedata[self.count_onlinedata] self.count_online += 1 self.count_onlinedata += 1 self.DataX_online = self.count_online + self.k else: self.flag_onlinedata = False self.count_onlinedata = self.count_onlinedata - 1 else: self.DataY_online = 0 self.count_online += 1 self.DataX_online = self.count_online + self.k self.dataX_online.pop(0) self.dataY_online.pop(0) self.dataX_online.append(self.DataX_online) self.dataY_online.append(self.DataY_online) time.sleep(INTERVAL_online) if self.__generating: self.canvas.plot(self.dataX_online, self.dataY_online) else: pass ########################离线plot##################################################### def offlinePlot(self): if self.__generating: if self.count_offline <= len(self.offlinedata): self.DataY_offline = self.offlinedata[self.count_offline] self.count_offline += 1 self.DataX_offline = self.count_offline + self.k else: self.count_offline = 0 self.dataX_offline.pop(0) self.dataY_offline.pop(0) self.dataX_offline.append(self.DataX_offline) self.dataY_offline.append(self.DataY_offline) time.sleep(INTERVAL_offline) self.canvas.plot(self.dataX_offline, self.dataY_offline) else: pass ########################plot线程##################################################### def plot_thread(self): print('Plot线程运行中 %s' % (ctime())) while True: if self.__exit: break self.canvas.ax.set_ylim(-3000, 3000) if self.flag_Zero: for self.k in range(0, MAXCOUNTER): self.dataY_online.append(0) self.dataX_online.append(self.k) self.dataY_offline.append(0) self.dataX_offline.append(self.k) self.flag_Zero = False else: pass if self.flag_online: self.onlinePlot() if self.flag_offline: self.offlinePlot() else: pass
class MPL_Widget(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.canvas = MyMplCanvas() #self.toolbar = MyNavigationToolbar(self.canvas, self.canvas, direction = 'v') self.toolbar = NavigationToolbar(self.canvas, self.canvas) self.toolbar.hide() self.hbox = QtGui.QHBoxLayout() #self.hbox.addWidget(self.toolbar) self.hbox.addWidget(self.canvas) self.setLayout(self.hbox) ########################## self.hZoom = QtGui.QAction("Zoom", self) self.hZoom.setShortcut("Ctrl+Z") self.addAction(self.hZoom) QtCore.QObject.connect(self.hZoom, QtCore.SIGNAL("triggered()"), self.ZoomToggle) self.actionAutoScale = QtGui.QAction("AutoScale", self) #self.MainWindow) self.actionAutoScale.setShortcut("Ctrl+A") self.addAction(self.actionAutoScale) QtCore.QObject.connect(self.actionAutoScale, QtCore.SIGNAL("triggered()"), self.autoscale_plot) self.installEventFilter(EventFilter(self)) ###########SAVING FIGURE TO CLIPBOARD########## self.cb = None #will be used for the clipboard self.tempPath = getHomeDir() self.tempPath = os.path.join(self.tempPath, 'tempMPL.png') def ZoomToggle(self): self.toolbar.zoom() def autoscale_plot(self): self.toolbar.home() def mpl2Clip(self): try: self.canvas.fig.savefig(self.tempPath) tempImg = QtGui.QImage(self.tempPath) self.cb = QtGui.QApplication.clipboard() self.cb.setImage(tempImg) except: print 'Error copying figure to clipboard' errorMsg = "Sorry: %s\n\n:%s\n" % (sys.exc_type, sys.exc_value) print errorMsg def focusEvent(self, event): # self.enableAutoScale() # self.enableZoom() self.enableClip() # self.enableCSV() #print "Focus In %s"%self.canvas.plotTitle def lossFocusEvent(self, event): # self.disableAutoScale() # self.disableZoom() self.disableClip() # self.disableCSV() #print "Focus Out %s"%self.canvas.plotTitle def enableClip(self): self.mpl2ClipAction = QtGui.QAction("Save to Clipboard", self) self.mpl2ClipAction.setShortcut("Ctrl+C") self.addAction(self.mpl2ClipAction) QtCore.QObject.connect(self.mpl2ClipAction, QtCore.SIGNAL("triggered()"), self.mpl2Clip) def disableClip(self): QtCore.QObject.disconnect(self.mpl2ClipAction, QtCore.SIGNAL("triggered()"), self.mpl2Clip) self.removeAction(self.mpl2ClipAction)
class MPL_Widget(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.canvas = MyMplCanvas() #self.toolbar = MyNavigationToolbar(self.canvas, self.canvas, direction = 'v') self.toolbar = NavigationToolbar(self.canvas, self.canvas) self.toolbar.hide() self.hbox = QtGui.QHBoxLayout() #self.hbox.addWidget(self.toolbar) self.hbox.addWidget(self.canvas) self.setLayout(self.hbox) ########################## self.hZoom = QtGui.QAction("Zoom", self) self.hZoom.setShortcut("Ctrl+Z") self.addAction(self.hZoom) QtCore.QObject.connect(self.hZoom,QtCore.SIGNAL("triggered()"), self.ZoomToggle) self.actionAutoScale = QtGui.QAction("AutoScale", self)#self.MainWindow) self.actionAutoScale.setShortcut("Ctrl+A") self.addAction(self.actionAutoScale) QtCore.QObject.connect(self.actionAutoScale,QtCore.SIGNAL("triggered()"), self.autoscale_plot) self.installEventFilter(EventFilter(self)) ###########SAVING FIGURE TO CLIPBOARD########## self.cb = None #will be used for the clipboard self.tempPath = getHomeDir() self.tempPath = os.path.join(self.tempPath,'tempMPL.png') def ZoomToggle(self): self.toolbar.zoom() def autoscale_plot(self): self.toolbar.home() def mpl2Clip(self): try: self.canvas.fig.savefig(self.tempPath) tempImg = QtGui.QImage(self.tempPath) self.cb = QtGui.QApplication.clipboard() self.cb.setImage(tempImg) except: print 'Error copying figure to clipboard' errorMsg = "Sorry: %s\n\n:%s\n"%(sys.exc_type, sys.exc_value) print errorMsg def focusEvent(self, event): # self.enableAutoScale() # self.enableZoom() self.enableClip() # self.enableCSV() #print "Focus In %s"%self.canvas.plotTitle def lossFocusEvent(self, event): # self.disableAutoScale() # self.disableZoom() self.disableClip() # self.disableCSV() #print "Focus Out %s"%self.canvas.plotTitle def enableClip(self): self.mpl2ClipAction = QtGui.QAction("Save to Clipboard", self) self.mpl2ClipAction.setShortcut("Ctrl+C") self.addAction(self.mpl2ClipAction) QtCore.QObject.connect(self.mpl2ClipAction,QtCore.SIGNAL("triggered()"), self.mpl2Clip) def disableClip(self): QtCore.QObject.disconnect(self.mpl2ClipAction,QtCore.SIGNAL("triggered()"), self.mpl2Clip) self.removeAction(self.mpl2ClipAction)
class MplCanvasWrapper(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.canvas = MplCanvas() self.vbl = QtGui.QVBoxLayout() self.ntb = NavigationToolbar(self.canvas, parent) self.ntb.hide() self.vbl.addWidget(self.ntb) self.vbl.addWidget(self.canvas) self.setLayout(self.vbl) self.dataX = [] self.dataY = [] self.data1 = [] self.data2 = [] self.count = 0 self.flag_newdata = False self.initDataGenerator() def startPlot(self): self.__generating = True def pausePlot(self): self.__generating = False pass def initDataGenerator(self): self.__generating = False self.__exit = False self.tData = threading.Thread(name="dataGenerator", target=self.generateData) self.tData.start() def releasePlot(self): self.__exit = True self.tData.join() def openflag_set(self): self.flag_newdata = True def openflag_clear(self): self.flag_newdata = False def generateData(self): counter = 0 print('绘图线程运行中 %s' % (ctime())) while (True): if self.__exit: break if self.__generating: if self.count <= MAXCOUNTER: self.canvas.ax.set_ylim(min(self.data1[0:MAXCOUNTER]), max(self.data1[0:MAXCOUNTER])) else: self.canvas.ax.set_ylim( min(self.data1[(self.count - MAXCOUNTER):self.count]), max(self.data1[(self.count - MAXCOUNTER):self.count])) if self.flag_newdata and self.count <= len(self.data1): newData = self.data1[self.count] self.count += 1 else: self.count = 0 self.flag_newdata = False newTime = date2num(datetime.now()) self.dataX.append(newTime) self.dataY.append(newData) self.canvas.plot(self.dataX, self.dataY) if counter >= MAXCOUNTER: self.dataX.pop(0) self.dataY.pop(0) else: counter += 1 time.sleep(INTERVAL)