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
