# # Visualizzazione di un grafico Pyplot in una dialog-box PyQt # secondaria. Rielaborazione dell'esempio 16: visualizzazione # di grafici multipli con dialog-box non modale e dispositivo # di chiusura dei grafici alla chiusura dell'applicazione. # import sys from matplotlib import pyplot from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg 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]) # # Creo una lista di "grafici": mi servira' # per tenerci i puntatori alle dialog-box # secondarie che devono essere chiuse # all'uscita dal programma. # self.grafici=[] # # Costruzione dei widget. # btnApri=QPushButton("Apri",self) btnFine=QPushButton("Fine",self) # # 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 innanzitutto una dialog-box # secondaria, la inserisco nella lista e # ne creo un riferimento per uso locale. # self.grafici.append(QDialog(self)) dlgViewer=self.grafici[-1] # # 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=NavigationToolbar2QTAgg(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.show() def reject(self): r=QMessageBox.question(self,"Conferma", "Sei sicuro? Tutti i grafici verranno chiusi!", QMessageBox.Yes | QMessageBox.No,QMessageBox.No) if r==QMessageBox.Yes: for dlgViewer in self.grafici: dlgViewer.reject() QDialog.reject(self) ########################## # Avvio dell'applicazione. # myApp=QApplication(sys.argv) dbm=dBoxMain(sys.argv) myApp.exec_()