''' @author: olivier.massot ''' import csv import sys from PyQt5 import uic from PyQt5.Qt import QMainWindow, QApplication, QMessageBox, QStandardItemModel, \ QStandardItem, Qt, QFileDialog from path import Path Ui_window, _ = uic.loadUiType(Path(__file__).parent / 'tsv_editor.ui') csv.register_dialect('tsv', delimiter='\t', quotechar='', quoting=csv.QUOTE_NONE) def exec_(filename=''): app = QApplication(sys.argv) SYS_HOOK = sys.excepthook def error_handler(typ, value, trace): while QApplication.overrideCursor(): QApplication.restoreOverrideCursor() QMessageBox.critical(iface, typ.__name__, "{}".format(value)) SYS_HOOK(typ, value, trace) sys.excepthook = error_handler if not filename: filename, _ = QFileDialog.getOpenFileName(None, "Selectionner un fichier TSV", ".", "Tsv Files (*.tsv *.csv)") iface = MainWindow(filename) iface.show() r = app.exec_() return r class MainWindow(QMainWindow): def __init__(self, csvpath): super (MainWindow, self).__init__() self.csvpath = csvpath self.createWidgets() def createWidgets(self): self.ui = Ui_window() self.ui.setupUi(self) self.ui.btn_cancel.clicked.connect(self.cancel) self.ui.btn_ok.clicked.connect(self.ok) self.model = QStandardItemModel(self) self.ui.tbl_data.setModel(self.model) self.ui.lbl_path.setText(self.csvpath) with open(self.csvpath, newline='') as csvfile: reader = csv.reader(csvfile, 'tsv') self.headers = next(reader) self.model.setHorizontalHeaderLabels(self.headers) for row in reader: items = [ QStandardItem(field) for field in row ] self.model.appendRow(items) def ok(self): with open(self.csvpath, "w", newline='') as fileOutput: writer = csv.writer(fileOutput, "tsv") writer.writerow(self.headers) 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())] writer.writerow(fields) self.close() def cancel(self): self.close() if __name__ == '__main__': exec_()