2017-11-21 15 views
0

PyQt5を学び、MatplotlibプロットをGUIに表示しようとしています。今、CSVファイルからMenubarのロードボタンでデータをロードしようとしています。私はこれを成功させることができます。私の問題は、このデータをグラフに表示することです。ここに私のコードは次のとおりです。PyQt5でMatplotlibを使用してCSVファイルをプロットする

OpenFile
import sys 
from PyQt5.QtWidgets import (QMainWindow, QAction, qApp, QApplication, QPushButton, QDesktopWidget, 
          QLabel, QFileDialog, QWidget, QGridLayout, QMenu, QSizePolicy, QMessageBox, QWidget) 
from PyQt5.QtGui import QIcon 
from PyQt5.QtCore import QCoreApplication, Qt 
from win32api import GetSystemMetrics 

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.figure import Figure 
import matplotlib.pyplot as plt 

import numpy as np 

import random 

CURRENT_VERSION = 0.1 

class Example(QMainWindow): 

    def __init__(self): 
     super().__init__() 

     self.initUI() 

    def initUI(self): 
     self.setWindowTitle('test') 

     window_width = GetSystemMetrics(0) 
     window_height = GetSystemMetrics(1) 

     self.resize(0.6 * window_width, 0.6 * window_height) 
     self.center() 

     self.setWindowIcon(QIcon('Icon.png')) 

     #inits 
     self.openDirectoryDialog = "" 
     self.data = np.empty(shape=(1,2), dtype=np.float) 

     #Exit on menubar 
     exitAct = QAction('&Exit', self) 
     exitAct.setShortcut('Ctrl+Q') 
     exitAct.setStatusTip('Exit applicatiion') 
     exitAct.triggered.connect(qApp.quit) 

     #Open on menubar 
     openAct = QAction('&Open', self) 
     openAct.setShortcut('Ctrl+O') 
     openAct.setStatusTip('Open Directory') 
     openAct.triggered.connect(self.openFile) 

     #menubar 
     menubar = self.menuBar() 
     fileMenu = menubar.addMenu('&File') 
     fileMenu.addAction(exitAct) 
     fileMenu.addAction(openAct) 

     #Central 
     centralwidget = QWidget(self) 
     self.setCentralWidget(centralwidget) 

     #Grid 
     grid = QGridLayout(centralwidget) 
     self.setLayout(grid) 

     #Plot 
     plotCan = PlotCanvas(self, width=5, height=4) 
     grid.addWidget(plotCan , 0,1) 

     #button 
     btn = QPushButton("Load Data", centralwidget) 
     btn.resize(btn.sizeHint()) 
     grid.addWidget(btn, 0,0) 

     btn.clicked.connect(plotCan .plot(self.data)) 

     self.show() 

    def center(self): 
     qr = self.frameGeometry() 
     cp = QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

    def openFile(self): 
     self.csvFile = QFileDialog.getOpenFileName(self, "Get Dir Path")[0] 
     self.data = np.loadtxt(self.csvFile, delimiter=',', dtype='S')[2:].astype(np.float) 

    def buttonpress(self): 
     self.plot(self.data) 

class PlotCanvas(FigureCanvas): 

    def __init__(self, parent=None, width=5, height=4, dpi=100): 
     fig = Figure(figsize=(width, height), dpi=dpi) 
     self.axes = fig.add_subplot(111) 

     FigureCanvas.__init__(self, fig) 
     self.setParent(parent) 

     FigureCanvas.setSizePolicy(self, 
       QSizePolicy.Expanding, 
       QSizePolicy.Expanding) 
     FigureCanvas.updateGeometry(self) 

    def plot(self, data = np.empty(shape=(1,2))): 
     ax = self.figure.add_subplot(111) 
     ax.plot(data[:,0],data[:,1], 'r-') 
     ax.set_title('PyQt Matplotlib Example') 
     self.draw() 

if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    w = Example() 
    sys.exit(app.exec_()) 

私は後で一般化されます非常に具体的なケースを持っているが、私は最初の2行は、ヘッダーですCSVファイルを使用しています。現在、プログラムを起動すると、エラーが発生します。

Traceback (most recent call last): 
    File "Plotter.py", line 115, in <module> 
    w = Example() 
    File "Plotter.py", line 23, in __init__ 
    self.initUI() 
    File "Plotter.py", line 75, in initUI 
    btn.clicked.connect(plotCav.plot(self.data)) 
TypeError: argument 1 has unexpected type 'NoneType' 

データは初期化されているためわかりません。

答えて

1

QObject.connect()関数には、呼び出し可能な引数が必要です。 btn.clicked.connect(plotCan.plot(self.data))を書いて、あなたは、あなたが呼び出しとともにself.data変数を渡したいので、したがって、エラーメッセージが

を受けている、それを(指定されていないreturn以来、デフォルトでNoneplotCan.plot(self.data)への呼び出しの結果を渡しています簡単な方法は、ラムダ

btn.clicked.connect(lambda: plotCan.plot(self.data)) 

を使用するためにこれはconnect()機能を満たし、かつplotCan.plot()

への呼び出しを延期されます
関連する問題