python - Pyside QPushButton与matplotlib的连接

标签 python matplotlib pyside

我正在尝试使用 matplotlib 开发一个非常简单的 pyside/Qt 程序。我希望在按下按钮时绘制图形。到目前为止,我可以在构造函数上绘制一些东西,但我无法将 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_()

非常感谢!

编辑:编辑了放置 draw() 的代码。

编辑 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()

最佳答案

尝试放入

self.canvas.draw()

之后

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

您的 GUI 代码看起来没问题,button_pressed 被正确调用,但图形没有被重绘。

关于python - Pyside QPushButton与matplotlib的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9488072/

相关文章:

python - matplotlib矩阵可视化: controling precision on float values

python - matplotlib 的 x 位置

python - 为什么 QThread 只打印两个线程调用之一?

python - 使用 Python 对元组中每个给定的第一个值求和元组中的第二个值

python - 如何返回不在列表中的键?

python - "Mark directory as sources root"到底是做什么的?

python - 如何让 QThreads 在控制台 PySide 程序中工作?

python - Django 错误的 url 解析 - 导致 example.com

python - 如何更改 matplotlib 中多个绘图的默认颜色?

python - 如何通过WebKit发送POST请求[PySide/PyQt]