2010-10-19 8 views
11

Я проектирую графический интерфейс с PyQt, где мне нужно отображать окно matplotlib/pylab, когда я нажимаю кнопку, которая делает график данных из созданной мной функции. Это похоже на время выполнения, используемое в Matlab. Я хочу, чтобы окно matplotlib/pylab было моим окном каждый раз, когда я нажимаю эту кнопку.Как рисовать на моем графическом интерфейсе

ответ

17

Вот базовый пример, который будет отображать три разных примера, используя 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

Вы генерации данных для построения внутри класса (с генератором случайных чисел). Возможно ли передавать данные извне. Что-то вроде этого: 'main = MyWindow (data)' – jonie83

2

Если я вас правильно понял вас есть приложение с графическим интерфейсом, и вы хотите, чтобы построить график в отдельном окне, чем GUI использует. pyqtgraph может сделать это красиво.

первого типа pip install pyqtgraph в командной строке, чтобы установить pyqtgraph

затем

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 

подробнее здесь: http://www.pyqtgraph.org/documentation/how_to_use.html

2

Это код из user1006989 (лучший ответ), адаптированный к PyQt5 , надеюсь, это будет полезно кому-то:

Вот простой пример, который будет строить три различных образцов с использованием 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_()) 
Смежные вопросы