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
Eli Bendersky ha scritto un esempio di codice che utilizza matplotlib entro PyQt: http://eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/
Integrazione Matplotlib con PyQt vuole un po 'di lavoro. Ecco un esempio: http://sourceforge.net/mailarchive/message.php?msg_id=29086544
Tuttavia, ci sono un paio di librerie di tracciato progettato specificamente intorno PyQt:
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_())
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
Questo è il codice da user1006989 (migliore risposta) adattato alla PyQt5 , si spera che possa essere utile a qualcuno:
.210Ecco 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_())
- 1. Come posso stampare sulla stessa linea?
- 2. come stampare la richiesta http sulla console
- 3. Come stampare tabelle ben formattate sulla console?
- 4. Come localizzare JLabels in una posizione assoluta sulla GUI Java
- 5. Come stampare un file di testo sulla stampante in Qt?
- 6. Come stampare sulla finestra REPL in un gestore Ring?
- 7. Come posso stampare sulla console a colori in modo multipiattaforma?
- 8. Android: Come posso stampare una variabile sulla console di eclipse
- 9. Come configurare log4net per stampare sulla console in modalità debug
- 10. Stampare nel file XPS e quindi stamparlo sulla stampante
- 11. Posso parlare Java per stampare sulla console sotto Mountain Lion?
- 12. Come vengono disegnate le GUI?
- 13. Come stampare un file wav
- 14. Come stampare l'array $ _POST?
- 15. Come stampare in C
- 16. Come stampare un Vec?
- 17. Come stampare dati json.
- 18. Come stampare la matrice?
- 19. Come stampare tempo come #inst
- 20. Come stampare il testo da textarea?
- 21. Come stampare l'anteprima quando si usa un DocumentPaginator per stampare?
- 22. come stampare automaticamente i file tiff
- 23. Come posso stampare una stringa sulla console senza una nuova riga alla fine?
- 24. Come rendere Crystal Report stampare direttamente sulla stampante senza esportare in PDF?
- 25. Come scrivere GUI in Python?
- 26. Delphi: come stampare un PDF senza mostrarlo?
- 27. Come stampare logging.info e logging.debug su console?
- 28. Programmazione GUI in LISP?
- 29. come stampare characterset nell'obiettivo c?
- 30. Come stampare più assi y?
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