2017-06-17 3 views
0

Ich habe ein Problem mit der Linie unter self.tableView.set??????????(df), die den Datenrahmen in PyQt5 anzeigen sollte. Ich legte ??? Dort wo ich den Code vermisse, den ich brauche.Wie man einen Pandas-Datenrahmen mit PyQt5 anzeigt

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

Der Rest des Codes arbeitet, denn wenn ich print(df) in dem obigen Code verwenden, wird der Datenrahmen in der Konsole IPython gedruckt. Pandas liest die CSV und druckt sie.

Aber ich habe viele Dinge versucht, um es in PyQt5 angezeigt und nichts funktioniert. Ich bin mit PyQt nicht sehr vertraut, habe einfach angefangen, damit herumzuspielen, und ich stecke hier fest.

Hier ist mein Code:

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_()) 

Antwort

5

Im Fall QTableView müssen die Daten durch ein Modell zur Verfügung gestellt werden, da sie das MVC (Model-View-Controller-) Paradigma, im Fall von Pandas implementiert es gibt kein Modell Standard, aber wir können eine benutzerdefinierte, wie es im folgenden Teil erstellen:

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

Und dann verwenden:

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

enter image description here

Der vollständige Code ist here

+0

Dank dieser so viel zu tun. Soll ich 'PandasModel' in meinen ursprünglichen Code mit' from PandasModel import PandasModel' importieren? Ich versuche, alles zusammenzusetzen, aber es funktioniert noch nicht. Wenn ich versuche, 'PandasModel' zu importieren, bekomme ich den Fehler 'kein Modul namens PandasModel'. Ich bin mir sicher, dass ich etwas vermisse. Kannst du mir bitte in die richtige Richtung zeigen? –

+0

Aktualisieren Sie meine Antwort, indem Sie den Code hinzufügen, wie Sie es verwenden sollten – eyllanesc

+0

Wow! Das ist wirklich großartig! Vielen Dank dafür. Es ist eine große Hilfe. Es funktioniert perfekt. –

Verwandte Themen