2017-06-17 2 views
0

self.tableView.set??????????(df)の下の行に問題があり、PyQt5でデータフレームを表示することになっていました。置いた ???私が必要とするコードがないところです。私は上記のコードでprint(df)を使用する場合、データフレームはIPythonコンソールに印刷されているのでPyQt5でパンダのデータフレームを表示するには

def btn_clk(self): 
     path = self.lineEdit.text() 
     df = pd.read_csv(path) 
     self.tableView.set??????????(df) 

コードの残りの部分は、動作します。だから、PandasはCSVを読み取り、それを印刷します。

しかし、私はそれをPyQt5で表示させるために多くのことを試みましたが、何も機能しません。私はPyQtにはあまり慣れていませんが、ちょうどそれで遊んで始めて、私はここで立ち往生しています。ここで

は私のコードです:それはMVCモデル - ビュー - コントローラ)パラダイムを実装しているのでQTableViewデータは、パンダの場合には、モデルによって提供されなければならない場合には

from PyQt5 import QtCore, QtGui, QtWidgets 
import pandas as pd 
class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(662, 512) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) 
     self.horizontalLayout.setObjectName("horizontalLayout") 
     self.verticalLayout = QtWidgets.QVBoxLayout() 
     self.verticalLayout.setObjectName("verticalLayout") 
     self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) 
     self.lineEdit.setObjectName("lineEdit") 
     self.verticalLayout.addWidget(self.lineEdit) 
     self.tableView = QtWidgets.QTableView(self.centralwidget) 
     self.tableView.setObjectName("tableView") 
     self.verticalLayout.addWidget(self.tableView) 
     self.pushButton = QtWidgets.QPushButton(self.centralwidget) 
     self.pushButton.setObjectName("pushButton") 
     self.verticalLayout.addWidget(self.pushButton) 
     self.horizontalLayout.addLayout(self.verticalLayout) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtWidgets.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 662, 21)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 
     self.pushButton.setText(_translate("MainWindow", "PushButton")) 


     self.pushButton.clicked.connect(self.btn_clk) 

     MainWindow.show() 

    def btn_clk(self): 
     path = self.lineEdit.text() 
     df = pd.read_csv(path) 
     self.tableView.set????????????(df) 


if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

答えて

5

そこには、デフォルトのモデルはありませんが、我々は、以下の一部のようにカスタムを作成することができます。

class PandasModel(QtCore.QAbstractTableModel): 
    def __init__(self, df = pd.DataFrame(), parent=None): 
     QtCore.QAbstractTableModel.__init__(self, parent=parent) 
     self._df = df 

    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole): 
     if role != QtCore.Qt.DisplayRole: 
      return QtCore.QVariant() 

     if orientation == QtCore.Qt.Horizontal: 
      try: 
       return self._df.columns.tolist()[section] 
      except (IndexError,): 
       return QtCore.QVariant() 
     elif orientation == QtCore.Qt.Vertical: 
      try: 
       # return self.df.index.tolist() 
       return self._df.index.tolist()[section] 
      except (IndexError,): 
       return QtCore.QVariant() 

    def data(self, index, role=QtCore.Qt.DisplayRole): 
     if role != QtCore.Qt.DisplayRole: 
      return QtCore.QVariant() 

     if not index.isValid(): 
      return QtCore.QVariant() 

     return QtCore.QVariant(str(self._df.ix[index.row(), index.column()])) 

    def setData(self, index, value, role): 
     row = self._df.index[index.row()] 
     col = self._df.columns[index.column()] 
     if hasattr(value, 'toPyObject'): 
      # PyQt4 gets a QVariant 
      value = value.toPyObject() 
     else: 
      # PySide gets an unicode 
      dtype = self._df[col].dtype 
      if dtype != object: 
       value = None if value == '' else dtype.type(value) 
     self._df.set_value(row, col, value) 
     return True 

    def rowCount(self, parent=QtCore.QModelIndex()): 
     return len(self._df.index) 

    def columnCount(self, parent=QtCore.QModelIndex()): 
     return len(self._df.columns) 

    def sort(self, column, order): 
     colname = self._df.columns.tolist()[column] 
     self.layoutAboutToBeChanged.emit() 
     self._df.sort_values(colname, ascending= order == QtCore.Qt.AscendingOrder, inplace=True) 
     self._df.reset_index(inplace=True, drop=True) 
     self.layoutChanged.emit() 

をし、それを使用します。

def btn_clk(self): 
    path = self.lineEdit.text() 
    df = pd.read_csv(path) 
    model = PandasModel(df) 
    self.tableView.setModel(model) 

enter image description here

完全なコードは、これを行うために多くhere

+0

おかげです。 'PandasModel import PandasModel'から' PandasModel'を元のコードにインポートするはずですか?私はそれをすべてまとめようとしているが、それはまだ働いていない。 'PandasModel'をインポートしようとすると、' PandasModel'という名前のモジュールがありません。私は何かが不足していると確信しています。正しい方向に私を向けることができますか? –

+0

あなたの使い方のコードを追加して私の答えを更新してください – eyllanesc

+0

うわー!これは本当に素晴らしいです!これは本当にありがとう。それは大きな助けです。それは完全に動作します。 –

関連する問題