2010-10-19 15 views
11

Sto progettando una GUI con PyQt dove ho bisogno di visualizzare una finestra matplotlib/pylab quando clicco su un pulsante che rende la trama dei dati da una funzione che ho creato. È come un runtime utilizzato in Matlab. Voglio mantenere la finestra matplotlib/pylab come la mia finestra ogni volta che premo quel pulsante.Come stampare sulla GUI

risposta

17

Ecco un esempio di base che traccerà tre diversi campioni utilizzando un QThread:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import random 

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg 
from matplotlib.figure import Figure 

from PyQt4 import QtGui, QtCore 

class MatplotlibWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MatplotlibWidget, self).__init__(parent) 

     self.figure = Figure() 
     self.canvas = FigureCanvasQTAgg(self.figure) 

     self.axis = self.figure.add_subplot(111) 

     self.layoutVertical = QtGui.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.canvas) 

class ThreadSample(QtCore.QThread): 
    newSample = QtCore.pyqtSignal(list) 

    def __init__(self, parent=None): 
     super(ThreadSample, self).__init__(parent) 

    def run(self): 
     randomSample = random.sample(range(0, 10), 10) 

     self.newSample.emit(randomSample) 

class MyWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.pushButtonPlot = QtGui.QPushButton(self) 
     self.pushButtonPlot.setText("Plot") 
     self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked) 

     self.matplotlibWidget = MatplotlibWidget(self) 

     self.layoutVertical = QtGui.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.pushButtonPlot) 
     self.layoutVertical.addWidget(self.matplotlibWidget) 

     self.threadSample = ThreadSample(self) 
     self.threadSample.newSample.connect(self.on_threadSample_newSample) 
     self.threadSample.finished.connect(self.on_threadSample_finished) 

    @QtCore.pyqtSlot() 
    def on_pushButtonPlot_clicked(self): 
     self.samples = 0 
     self.matplotlibWidget.axis.clear() 
     self.threadSample.start() 

    @QtCore.pyqtSlot(list) 
    def on_threadSample_newSample(self, sample): 
     self.matplotlibWidget.axis.plot(sample) 
     self.matplotlibWidget.canvas.draw() 

    @QtCore.pyqtSlot() 
    def on_threadSample_finished(self): 
     self.samples += 1 
     if self.samples <= 2: 
      self.threadSample.start() 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.resize(666, 333) 
    main.show() 

    sys.exit(app.exec_()) 

image

+0

Si sta generando i dati per la stampa all'interno della vostra classe (con il generatore casuale). È possibile passare i dati dall'esterno. Qualcosa del genere: 'main = MyWindow (data)' – jonie83

2

Se ho capito bene si dispone di un'applicazione con una GUI e si vuole tracciare un grafico in una finestra separata rispetto alla GUI utilizza. pyqtgraph può farlo bene.

primo tipo pip install pyqtgraph nel prompt dei comandi per installare pyqtgraph

poi

import pyqtgraph as pg 

    pg.setConfigOption('background', 'w')  # sets background to white             
    pg.setConfigOption('foreground', 'k')  # sets axis color to black 

    pw = pg.plot(x, y, pen='g')    # 1st plot (green)           
    pw.plot(x2, y2, pen='b')     # 2nd plot in same figure (blue) 

    pw.setLabel('bottom', 'x-label')   # x-label 
    pw.setLabel('left', 'y-label')    # y-label 

maggiori informazioni qui: http://www.pyqtgraph.org/documentation/how_to_use.html

2

Questo è il codice da user1006989 (migliore risposta) adattato alla PyQt5 , si spera che possa essere utile a qualcuno:

.210

Ecco un esempio di base che tracciare tre diversi campioni usando un QThread:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import random 

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg 
from matplotlib.figure import Figure 

from PyQt5 import QtCore #conda install pyqt 
from PyQt5 import QtWidgets 

class MatplotlibWidget(QtWidgets.QWidget): 
    def __init__(self, parent=None): 
     super(MatplotlibWidget, self).__init__(parent) 

     self.figure = Figure() 
     self.canvas = FigureCanvasQTAgg(self.figure) 

     self.axis = self.figure.add_subplot(111) 

     self.layoutVertical = QtWidgets.QVBoxLayout(self)#QVBoxLayout 
     self.layoutVertical.addWidget(self.canvas) 

class ThreadSample(QtCore.QThread): 
    newSample = QtCore.pyqtSignal(list) 

    def __init__(self, parent=None): 
     super(ThreadSample, self).__init__(parent) 

    def run(self): 
     randomSample = random.sample(range(0, 10), 10) 

     self.newSample.emit(randomSample) 

class MyWindow(QtWidgets.QWidget): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.pushButtonPlot = QtWidgets.QPushButton(self) 
     self.pushButtonPlot.setText("Plot") 
     self.pushButtonPlot.clicked.connect(self.on_pushButtonPlot_clicked) 

     self.matplotlibWidget = MatplotlibWidget(self) 

     self.layoutVertical = QtWidgets.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.pushButtonPlot) 
     self.layoutVertical.addWidget(self.matplotlibWidget) 

     self.threadSample = ThreadSample(self) 
     self.threadSample.newSample.connect(self.on_threadSample_newSample) 
     self.threadSample.finished.connect(self.on_threadSample_finished) 

    @QtCore.pyqtSlot() 
    def on_pushButtonPlot_clicked(self): 
     self.samples = 0 
     self.matplotlibWidget.axis.clear() 
     self.threadSample.start() 

    @QtCore.pyqtSlot(list) 
    def on_threadSample_newSample(self, sample): 
     self.matplotlibWidget.axis.plot(sample) 
     self.matplotlibWidget.canvas.draw() 

    @QtCore.pyqtSlot() 
    def on_threadSample_finished(self): 
     self.samples += 1 
     if self.samples <= 2: 
      self.threadSample.start() 

if __name__ == "__main__": 
    import sys 

    app = QtWidgets.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.resize(666, 333) 
    main.show() 

    sys.exit(app.exec_()) 
Problemi correlati