Reputation: 55
I am able to load in and write to a CSV file into my QTableView, however, I want to be able to adapt this code to be able to do this for two different CSV files in two separate tableViews, withing two tabs of a QTabWidget.
import sys
import csv
import fileinput
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWindow(QWidget):
def __init__(self, fileName, parent=None):
super(MyWindow, self).__init__(parent)
MyWindow.setGeometry(self, 0,0,800,420)
self.fileName = fileName
self.model = QStandardItemModel(self)
self.tableView = QTableView(self)
self.tableView.setModel(self.model)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.pushButtonLoad = QPushButton(self)
self.pushButtonLoad.setText("Load Csv File!")
self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)
self.pushButtonWrite = QPushButton(self)
self.pushButtonWrite.setText("Write Csv File!")
self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)
self.layoutVertical = QVBoxLayout(self)
self.layoutVertical.addWidget(self.tableView)
self.layoutVertical.addWidget(self.pushButtonLoad)
self.layoutVertical.addWidget(self.pushButtonWrite)
def loadCsv(self, fileName):
with open(fileName, "r") as fileInput:
for row in csv.reader(fileInput):
items = [
QStandardItem(field)
for field in row
]
self.model.appendRow(items)
#self.model.layoutChanged.emit()
def writeCsv(self, fileName):
with open(fileName, "w") as fileOutput:
writer = csv.writer(fileOutput, lineterminator='\n')
print('rowCount->', self.model.rowCount())
for rowNumber in range(self.model.rowCount()):
fields = [
self.model.data(
self.model.index(rowNumber, columnNumber),
Qt.DisplayRole
)
for columnNumber in range(self.model.columnCount())
]
print('fields->', fields)
writer.writerow(fields)
@pyqtSlot()
def on_pushButtonWrite_clicked(self):
self.writeCsv(self.fileName)
self.model.layoutChanged.emit()
@pyqtSlot()
def on_pushButtonLoad_clicked(self):
self.loadCsv(self.fileName)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow("C:\Qt\csv.csv")
main.show()
sys.exit(app.exec_())
I know how to add the two table views to separate tab widgets, its just the methods for the load and write buttons to handle two separate csv files.
Upvotes: 0
Views: 236
Reputation: 243955
In your case you should have 2 widgets of the same type in each tab so creating a custom class is a good option. On the other hand it is better to get the CSV through a dialogue because if you want to load another file you would have to modify the code and the user should not do that. And finally I'll create a QMainWindow where the QTabWidget will be placed, and in each tab I'll set the custom widget.
import sys
import csv
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.setGeometry(0, 0, 800, 420)
self.model = QtGui.QStandardItemModel(self)
self.tableView = QtWidgets.QTableView()
self.tableView.setModel(self.model)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.pushButtonLoad = QtWidgets.QPushButton("Load Csv File!",
clicked=self.on_pushButtonLoad_clicked)
self.pushButtonWrite = QtWidgets.QPushButton("Write Csv File!",
clicked=self.on_pushButtonWrite_clicked)
layoutVertical = QtWidgets.QVBoxLayout(self)
layoutVertical.addWidget(self.tableView)
layoutVertical.addWidget(self.pushButtonLoad)
layoutVertical.addWidget(self.pushButtonWrite)
def loadCsv(self, fileName):
self.model.clear()
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, lineterminator='\n')
print('rowCount->', self.model.rowCount())
for rowNumber in range(self.model.rowCount()):
fields = [
self.model.item(rowNumber, columnNumber).text()
for columnNumber in range(self.model.columnCount())
]
print('fields->', fields)
writer.writerow(fields)
@QtCore.pyqtSlot()
def on_pushButtonWrite_clicked(self):
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self, self.tr("Open CSV"),
QtCore.QDir.currentPath(), self.tr("CSV Files (*.csv)"))
if fileName:
self.writeCsv(fileName)
@QtCore.pyqtSlot()
def on_pushButtonLoad_clicked(self):
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, self.tr("Open CSV"),
QtCore.QDir.currentPath(), self.tr("CSV Files (*.csv)"))
if fileName:
self.loadCsv(fileName)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
tabwidget = QtWidgets.QTabWidget()
self.setCentralWidget(tabwidget)
tabwidget.addTab(Widget(), "tab1")
tabwidget.addTab(Widget(), "tab2")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MainWindow()
main.show()
sys.exit(app.exec_())
Upvotes: 3