2012-02-28 16 views
4

私はmatplotlibを使って非常に単純なpyside/Qtプログラムを開発しようとしています。私はボタンが押されたときにグラフが描画されることを望みます。これまでのところ、私はコンストラクタ上に何かを描くことができますが、Pysideイベントをmatplotlibと接続することはできません。それを行う方法はありますか?Pyside QPushButtonと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_() 

ありがとうございます!

EDIT:draw()を入れるコードを編集しました。

EDIT 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() 
+0

クリックした信号の接続が正常に動作するように見えます。 button_pressed()スロットは呼び出されませんか?あなたは正確に何がうまくいかないのか、より具体的になりますか? – jdi

+0

ボタンが押されていて、接続が機能しています - 端末に「押されました」が表示されています。しかしグラフは再描画されていません。 – Ivan

+0

あなたは@ jeffの答えを試しましたか?私は質問 – jdi

答えて

2

self.canvas.draw() 

に入れてみてください

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

GUIコードが正常に表示され、button_pressedが正しく呼び出されていますが、グラフが再描画されていません。

+0

正確に問題があり、それは働いた。毎回グラフを再描画する必要がある理由は何ですか? – Ivan

+0

@イワン私はなぜ明示的に 'draw'を呼び出さなければならないのか分かりません。私は 'plot'メソッドが私たちのためにそれを行うべきだと思います。 – Jeff

+0

Axesオブジェクトが必ずしも表示オブジェクト(キャンバス)であるとは限りませんし、ドローイベントが発生することを決定する前に複数回プロットする必要があるかもしれないので、私はそれを推測していますか? – jdi

関連する問題