Jimmy
Jimmy

Reputation: 55

How do I display two different CSV files in two QTableViews in a tabWidget?

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

Answers (1)

eyllanesc
eyllanesc

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

Related Questions