соединение Pyside QPushButton и matplotlib - PullRequest
3 голосов
/ 28 февраля 2012

Я пытаюсь разработать очень простую программу для pyside / Qt с использованием matplotlib. Я хочу, чтобы график рисовался при нажатии кнопки. Пока что я могу что-то нарисовать на конструкторе, но не могу связать событие Pyside с matplotlib. Есть ли способ сделать это?

import sys
import platform

import numpy as np
import PySide
from PySide.QtGui import QApplication, QMainWindow, QTextEdit,\
                         QPushButton,  QMessageBox, QWidget, QVBoxLayout
from PySide import QtCore



__version__ = '0.0.1'


import matplotlib

matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'

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


class MainWindow(QMainWindow):


    def __init__(self, parent=None):

        super(MainWindow, self).__init__(parent)

        self.main_frame = QWidget()
        self.figure = Figure()
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setParent( self.main_frame )
        self.axes = self.figure.add_subplot(111)
        vbox = QVBoxLayout( )
        vbox.addWidget( self.canvas )
        self.main_frame.setLayout( vbox )
        self.setCentralWidget( self.main_frame )
        self.button = QPushButton('Run')

    def button_pressed(self):
        data1 = np.loadtxt('FStream.dat')
        data2 = np.loadtxt('FShield.dat')
        self.axes.plot(data1[0],data1[1],data2[0],data2[1])
        print 'pressed'
        self.canvas.draw()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    frame = MainWindow()

    frame.button.clicked.connect(frame.button_pressed)
    frame.button.show()  


    frame.show()
    app.exec_()

Большое спасибо!

РЕДАКТИРОВАТЬ: отредактировал код, чтобы поставить ничью ().

РЕДАКТИРОВАТЬ 2: Разделение на разные функции теперь выглядит так:

import sys
import platform

import numpy as np
import PySide
from PySide.QtGui import QApplication, QMainWindow, QTextEdit,\
                         QPushButton,  QMessageBox, QWidget, QVBoxLayout
from PySide import QtCore



__version__ = '0.0.1'

from ui_pygradient_uni import Ui_MainWindow
import matplotlib
import widgets.matplotlibwidget

matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'

#from matplotlib.figure import Figure
#from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas


class MainWindow(QMainWindow):


    def __init__(self, parent=None):

        super(MainWindow, self).__init__(parent)

        self.main_frame = widgets.matplotlibwidget.MatplotlibWidget()

        self.button = QPushButton('Run')

        vbox = QVBoxLayout( )
        vbox.addWidget( self.main_frame.canvas )
        self.main_frame.setLayout( vbox )
        self.setCentralWidget( self.main_frame )

    def button_pressed(self):
        data1 = np.loadtxt('FStream.dat')
        data2 = np.loadtxt('FShield.dat')
        self.axes.plot(data1[0],data1[1],data2[0],data2[1])
        self.canvas.draw()
        print 'pressed'


if __name__ == '__main__':
    app = QApplication(sys.argv)
    frame = MainWindow()

    frame.button.clicked.connect(frame.main_frame.Plot)
    frame.button.show()  


    frame.show()
    app.exec_()

И matplotlibwidget выглядит так:

import matplotlib
import numpy as np


matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'


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



class MatplotlibWidget(FigureCanvas):

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

        self.setParent(parent)
        self.figure = Figure()
        self.canvas = FigureCanvas(self.figure)
        self.axes = self.figure.add_subplot(111)


    def Plot(self):


        data1 = np.loadtxt('FStream.dat')
        data2 = np.loadtxt('FShield.dat')

        self.axes.plot(data1[0],data1[1],data2[0],data2[1])
        self.canvas.draw()

1 Ответ

2 голосов
/ 29 февраля 2012

Попробуйте ввести

self.canvas.draw()

после

self.axes.plot(data1[0],data1[1],data2[0],data2[1])

Ваш код GUI выглядит нормально, и button_pressed вызывается правильно, но график не перерисовывается.

...