# # Visualizzazione di un grafico Pyplot in una dialog-box PyQt # secondaria. Rispetto all'esempio16, viene definita e poi # istanziata una classe "Qt4MplCanvas" figlia della # "FigureCanvasQTAgg" (mentre nell'esempio16 veniva direttamente # istanziato un oggetto della classe "FigureCanvasQTAgg"); questo # approccio e' utile se se ne vogliono modificare molte proprieta'. # import sys from matplotlib import pyplot from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT from PyQt4.QtCore import * from PyQt4.QtGui import * ########################################## # Classe di interfaccia PyQt - Matplotlib. # class Qt4MplCanvas(FigureCanvasQTAgg): def __init__(self,fig,parent=None): # # Inserisce il grafico nel canvas # di interfaccia PyQt - Matplotlib. # FigureCanvasQTAgg.__init__(self,fig) self.setParent(parent) ################################# # Classe della dialog principale. # class dBoxMain(QDialog): def __init__(self,args): # # Costruttore della dialog principale. # QDialog.__init__(self) self.setWindowTitle(args[0]) # # Costruzione dei widget. # btnApri=QPushButton("Apri",self) btnFine=QPushButton("Fine",self) # # Amicizia Label-Controlli. # # # Definizione del layout. # vlt=QVBoxLayout() vlt.addWidget(btnApri) vlt.addWidget(btnFine) self.setLayout(vlt) # # Connessione eventi-metodi (signals-slots). # self.connect(btnApri,SIGNAL("clicked(bool)"),self.showgraph) self.connect(btnFine,SIGNAL("clicked(bool)"),self.reject) # # Operazioni che devono avvenire una sola # volta al lancio dell'applicazione. # self.show() # # Procedure operative della dialog box principale. # def showgraph(self): fName=QFileDialog.getOpenFileName(self,"Apri dati", ".","File di testo (*.txt *.prn *.csv)") if fName: # # Preparo il grafico come "figure" # pyplot, in base ai dati del file. # x=[] y=[] with open(fName,"rt") as fp: for s in fp.readlines(): (xx,yy)=s.split(',') x.append(xx) y.append(yy) pyFig=pyplot.figure() pyplot.subplot(111) pyplot.plot(x,y,linewidth=2.0) pyplot.title("GRAFICO SEGNALE") pyplot.xlabel('Tempo [s]') pyplot.ylabel('Ampiezza [V]') pyplot.grid(True) # # Costruisco una dialog-box secondaria. # dlgViewer=QDialog(self) # # Costruisco l'oggetto di interfaccia # PyQt - Matplotlib, passandogli la # figura pyplot da mostrare; la proprieta' # di questo oggetto viene assegnata alla # dialog-box che deve contenerlo. # mplGraf=Qt4MplCanvas(pyFig,dlgViewer) # # Costruisco anche la tool-bar di # controllo di Matplotlib. "False" # come ultimo parametro permette # di eliminare la finestrina delle # coordinate variabili; la proprieta' # di questo oggetto viene assegnata # alla dialog-box che deve contenerlo. # ntbGraf=NavigationToolbar2QT(mplGraf,dlgViewer,False) # # Inserisco i due oggetti Matplotlib nella # dialog-box, utilizzando un layout verticale, # con la tool-bar SOPRA il grafico. # viewLay=QVBoxLayout() viewLay.addWidget(ntbGraf) viewLay.addWidget(mplGraf) dlgViewer.setLayout(viewLay) # # Visualizzo la dialog-box secondaria # ed in essa il grafico desiderato. # dlgViewer.move(20,20) dlgViewer.exec_() ########################## # Avvio dell'applicazione. # myApp=QApplication(sys.argv) dbm=dBoxMain(sys.argv) myApp.exec_()