TypeError: 'sip.wrappertype' object is not subscriptable

При вызове интерфейса не работают кнопки кроме Load Csv и Write Csv. На остальных кнопках вылезают разные ошибки.

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from __future__ import print_function
import csv
import sys
import pandas as pd
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QAbstractTableModel, Qt
from PyQt5 import QtWidgets

class df2(QtWidgets.QWidget):
    def __init__(self, fileName, parent=None):
        super(df2, self).__init__(parent)
        self.fileName = fileName

        self.model = QtGui.QStandardItemModel(self)

        self.tableView = QtWidgets.QTableView(self)
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)

        self.pushButtonLoad = QtWidgets.QPushButton(self)
        self.pushButtonLoad.setText("Load Csv")
        self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)

        self.pushButtonWrite = QtWidgets.QPushButton(self)
        self.pushButtonWrite.setText("Write Csv")
        self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)
        
        self.pushButtonNumber = QtWidgets.QPushButton(self)
        self.pushButtonNumber.setText("Number of rows and columns")
        self.pushButtonNumber.clicked.connect(self.on_pushButtonNumber_clicked)
        
        self.pushButtonGraph1 = QtWidgets.QPushButton(self)
        self.pushButtonGraph1.setText("Graph #1")
        self.pushButtonGraph1.clicked.connect(self.on_pushButtonGraph1_clicked)
        
        self.pushButtonGraph2 = QtWidgets.QPushButton(self)
        self.pushButtonGraph2.setText("Graph #2")
        self.pushButtonGraph2.clicked.connect(self.on_pushButtonGraph2_clicked)

        self.layoutVertical = QtWidgets.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.tableView)
        self.layoutVertical.addWidget(self.pushButtonLoad)
        self.layoutVertical.addWidget(self.pushButtonWrite)
        self.layoutVertical.addWidget(self.pushButtonNumber)
        self.layoutVertical.addWidget(self.pushButtonGraph1)
        self.layoutVertical.addWidget(self.pushButtonGraph2)

    def loadCsv(self, fileName):
        with open(fileName, "r") as fileInput:
            for row in csv.reader(fileInput):    
                items = [
                    QtGui.QStandardItem(field)
                    for field in row 
                ]             
                self.model.appendRow(items)
                
    def writeCsv(self, fileName):
        with open(fileName, "w") as fileOutput:
            writer = csv.writer(fileOutput)
            for rowNumber in range(self.model.rowCount()):
                fields = [
                    self.model.data(
                        self.model.index(rowNumber, columnNumber),
                        QtCore.Qt.DisplayRole
                    )
                    for columnNumber in range(self.model.columnCount())
                ]
                writer.writerow(fields)
                
    def graph1(self, fileName):
        plt.scatter(df2['Health_Camp_ID'], df2['Outcome'], color='red')
        plt.xlabel('Health_Camp_ID', fontsize=16)
        plt.ylabel('Outcome', fontsize=16)
        plt.grid(True)
        plt.show()
        
    def graph2(self, fileName):
        df2.plot()
        plt.xlabel('Переменная х', fontsize=16, color='green')
        plt.ylabel('Переменная у', fontsize=16, color='orange')
        plt.title('График функции')
        plt.show()
    
    def number(self, fileName):
        ui.label2.setNum(df2.shape[0])
        ui.label2.setNum(df2.shape[1])
        
    def Exit(self):
        sys.exit()

    @QtCore.pyqtSlot()
    def on_pushButtonWrite_clicked(self):
        self.writeCsv(self.fileName)

    @QtCore.pyqtSlot()
    def on_pushButtonLoad_clicked(self):
        self.loadCsv(self.fileName)
      
    @QtCore.pyqtSlot()
    def on_pushButtonNumber_clicked(self):
        self.number(self.fileName)
        
    @QtCore.pyqtSlot()
    def on_pushButtonGraph1_clicked(self):
        self.graph1(self.fileName)
        
    @QtCore.pyqtSlot()
    def on_pushButtonGraph2_clicked(self):
        self.graph2(self.fileName)
        
if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    app.setApplicationName('df2')
    main = df2("sample_submission.csv")
    main.show()

    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Не работают потому что неправильно написано и ошибки говорят об этом.

Я думал вы внесете какую-то ясность на мой запрос в комментарии, но не судьба.

Я увидел вашу задачу так и добавил построение некоторых графиков, которые можно перерисовать после корректировки таблицы. Вы можете заметить один график отображается как самостоятельное окно, а другой встраивается в интерфейс главного окна. Попробуйте.

import csv
import sys
import pandas as pd
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QAbstractTableModel, Qt
# +
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure


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


class DF2(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(DF2, self).__init__(parent)
        self.fileName = None 
        
        self.sc = MplCanvas(self, width=5, height=4, dpi=100)

        self.pushButtonLoad = QtWidgets.QPushButton(self)
        self.pushButtonLoad.setText("Load Csv") 
        self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)
        self.pushButtonWrite = QtWidgets.QPushButton(self)
        self.pushButtonWrite.setText("Write Csv")        
        self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)
        self.pushButtonNumber = QtWidgets.QPushButton(self)
        self.pushButtonNumber.setText("Number of rows and columns")
        self.pushButtonNumber.clicked.connect(self.on_pushButtonNumber_clicked)
        self.pushButtonGraph1 = QtWidgets.QPushButton(self)
        self.pushButtonGraph1.setText("Graph #1")
        self.pushButtonGraph1.clicked.connect(self.on_pushButtonGraph1_clicked)
        self.pushButtonGraph2 = QtWidgets.QPushButton(self)
        self.pushButtonGraph2.setText("Graph #2")
        self.pushButtonGraph2.clicked.connect(self.on_pushButtonGraph2_clicked)

        self.tableWidget = QtWidgets.QTableWidget()                       # +
        self.label2 = QtWidgets.QLabel()                                  # +

        self.layoutVertical = QtWidgets.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.sc)
        self.layoutVertical.addWidget(self.tableWidget)
        self.layoutVertical.addWidget(self.label2)
        self.layoutVertical.addWidget(self.pushButtonLoad)
        self.layoutVertical.addWidget(self.pushButtonWrite)
        self.layoutVertical.addWidget(self.pushButtonNumber)
        self.layoutVertical.addWidget(self.pushButtonGraph1)
        self.layoutVertical.addWidget(self.pushButtonGraph2)

    @QtCore.pyqtSlot()
    def on_pushButtonLoad_clicked(self):                                  # loadCsv
        path, _ = QtWidgets.QFileDialog.getOpenFileName(
            self, 'Open CSV', '', 'CSV(*.csv)')
        if path:    
            self.all_data = pd.read_csv(path)
            self.fileName = path           
            self.dataHead()
            self.label2.clear()
            
    def dataHead(self):
        numColomn = 0     
        if numColomn == 0:
            NumRows = len(self.all_data.index)
        else:
            NumRows = numColomn
            
        self.tableWidget.setColumnCount(len(self.all_data.columns))
        self.tableWidget.setRowCount(NumRows)
        self.tableWidget.setHorizontalHeaderLabels(self.all_data.columns)
        for i in range(NumRows):
            for j in range(len(self.all_data.columns)):
                self.tableWidget.setItem(
                    i, j, QtWidgets.QTableWidgetItem(str(self.all_data.iat[i, j]))
                )

        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.resizeRowsToContents()

    @QtCore.pyqtSlot()
    def on_pushButtonWrite_clicked(self):                                 # Write Csv
        if self.fileName is None:
            msg = QtWidgets.QMessageBox.information(
                self, 
                'Message', 
                f'Сохранять нечего!'
            )
            return
    
        fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
            self, 
            'Сохранить как CSV', 
            '.',                                              
            'CSV(*.csv)'
        ) 
        if fileName:
            with open(fileName, "w") as fileOutput:
                writer = csv.writer(fileOutput)
                HeaderLabels = [
                    self.tableWidget.horizontalHeaderItem(columnNumber).text() 
                    for columnNumber in range(self.tableWidget.columnCount())
                ]
                writer.writerow(HeaderLabels)                                
                for rowNumber in range(self.tableWidget.rowCount()):
                    fields = [
                        self.tableWidget.item(rowNumber, columnNumber).text() 
                        for columnNumber in range(self.tableWidget.columnCount())
                    ]
                    writer.writerow(fields)                    

    @QtCore.pyqtSlot()
    def on_pushButtonNumber_clicked(self):            # Number of rows and columns
        self.label2.setText(f'rows = {self.tableWidget.rowCount()}, ' 
                            f'columns = {self.tableWidget.columnCount()}')   

    @QtCore.pyqtSlot()
    def on_pushButtonGraph1_clicked(self):                                # Graph2 
        if not self.tableWidget.rowCount():
            msg = QtWidgets.QMessageBox.information(
                self, 
                'Message', 
                f'Показывать нечего!'
            )            
            return

        fig, ax = plt.subplots(1, 1, num=1, clear=True)

        fields = []
        for columnNumber in range(2):
            fields.append([
                float(self.tableWidget.item(rowNumber, columnNumber).text()) 
                for rowNumber in range(self.tableWidget.rowCount())
            ]) 
        plt.scatter(fields[0], fields[1], color='red')
        plt.xlabel('Health_Camp_ID', fontsize=16)
        plt.ylabel('Outcome', fontsize=16)
        plt.grid(True)
        plt.show()

    @QtCore.pyqtSlot()
    def on_pushButtonGraph2_clicked(self):                                # Graph2 
        if not self.tableWidget.rowCount():
            msg = QtWidgets.QMessageBox.information(
                self, 
                'Message', 
                f'Показывать нечего!'
            )            
            return
    
        self.sc.axes.clear() 
        fields = []
        for rowNumber in range(self.tableWidget.rowCount()):
            fields.append([
                float(self.tableWidget.item(rowNumber, columnNumber).text()) 
                for columnNumber in range(self.tableWidget.columnCount())
            ])        
        HeaderLabels = [
            self.tableWidget.horizontalHeaderItem(columnNumber).text() 
            for columnNumber in range(self.tableWidget.columnCount())
        ]
        df = pd.DataFrame(fields, columns=HeaderLabels) 
        df.plot(ax=self.sc.axes)
        self.sc.axes.grid(True)    
        self.sc.draw()   
        toolbar = NavigationToolbar(self.sc, self)
        
        
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main = DF2() 
    main.resize(350, 680)
    main.show()
    sys.exit(app.exec_())

test.csv

A,B
0,10
5,1
2,20
15,25
4,10

введите сюда описание изображения

→ Ссылка