Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import csv
- import inspect
- import os
- from typing import Iterable, List
- from PyQt5 import QtCore, QtGui, QtWidgets
- class BetterTable(QtWidgets.QTableWidget):
- filepath = os.path.dirname(inspect.getfile(inspect.currentframe()))
- def __init__(self, datafile=None):
- super().__init__()
- self.datafile = datafile
- self.table_headers = []
- self.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- def setItem(self, row: int, column: int, item: str):
- item = QtWidgets.QTableWidgetItem(item)
- super().setItem(row, column, item)
- def setRow(self, rowindex: int, items: Iterable):
- '''
- sets Items to specified row
- '''
- if rowindex >= self.rowCount():
- rowindex = self.rowCount() # Appending at the end of the rows
- items = list(map(str, items))
- for index in range(self.columnCount()):
- try:
- self.setItem(rowindex, index, items[index])
- except IndexError:
- break # breaks loop because there are no more items
- def setColumn(self, columnindex: int, items: Iterable):
- '''
- sets items to specified column
- '''
- if columnindex >= self.columnCount():
- columnindex = self.columnCount() # Appending at the end of the columns
- items = list(map(str, items))
- for index in range(self.rowCount()):
- try:
- self.setItem(index, columnindex, items[index])
- except IndexError:
- break # breaks loop because there are no more items
- def addRow(self, index: int=None):
- '''Inserts column at the end'''
- if not index:
- index = self.rowCount()
- self.insertRow(index)
- def addColumn(self, index: int=None):
- '''Inserts column at the end'''
- if not index:
- index = self.columnCount()
- # show Dialog which asks for header name
- dialog = HeaderDialog()
- dialog.exec_()
- if dialog.result():
- self.insertColumn(index)
- header = dialog.header.text()
- new_header = QtWidgets.QTableWidgetItem(header)
- self.setHorizontalHeaderItem(index, new_header)
- self.table_headers.append(header)
- def alignColumn(self, columnindex: int, alignment: QtCore.Qt.Alignment):
- '''
- aligns a whole column
- '''
- for index in range(self.rowCount()):
- self.item(index, columnindex).setTextAlignment(alignment)
- def populate(self, data: List[List], headers: List[str]=None):
- '''
- Populates the table from a 2 dimensional array
- '''
- if not headers:
- # set headers to first row of data
- headers = data.pop(0)
- self.table_headers.extend(headers)
- self.setRowCount(len(data))
- if data:
- self.setColumnCount(max([len(row) for row in data]))
- else:
- self.setColumnCount(len(self.table_headers))
- for rowindex, row in enumerate(data):
- self.setRow(rowindex, row)
- self.setHorizontalHeaderLabels(headers)
- self.resizeRowsToContents()
- self.resizeColumnsToContents()
- def getRow(self, rowindex: int) -> List:
- '''
- returns a list with the Items of the row
- '''
- lst = []
- for index in range(self.columnCount()):
- lst.append(self.item(rowindex, index).text())
- return lst
- def getColumn(self, columnindex: int) -> List:
- '''
- returns a list with the Items of the column
- '''
- lst = []
- for index in range(self.rowCount()):
- lst.append(self.item(index, columnindex).text())
- return lst
- def closeEvent(self, event: QtCore.QEvent):
- self.save()
- event.accept()
- def save(self):
- if not bool(self.datafile):
- filedialog = QtWidgets.QFileDialog()
- filedata = filedialog.getSaveFileName(caption="Save file",
- directory=self.filepath,
- filter="Character Seperated Values(*.csv)"
- )
- if filedata[0]: # bool('') == False / canceling Filedata will return ('','')
- filepath = filedata[0]
- else:
- filepath = os.path.join(self.filepath, self.datafile)
- table = []
- table.append(self.table_headers)
- for rowindex in range(self.rowCount()):
- table.append(self.getRow(rowindex))
- if filepath and table:
- # newline is required because csv will add blank line
- with open(filepath, 'w', newline='', encoding='utf-8') as file:
- writer = csv.writer(file)
- writer.writerows(table)
- else:
- print("either table or filepath is nonexistend")
- class HeaderDialog(QtWidgets.QDialog):
- def __init__(self):
- # removes Icon, Help and Close Buttons
- super().__init__(None,
- QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint
- )
- self.setWindowTitle("Spalten Name")
- self.layout = QtWidgets.QHBoxLayout()
- self.buttonBox = QtWidgets.QDialogButtonBox()
- self.desclabel = QtWidgets.QLabel("Spalten Name:")
- self.header = QtWidgets.QLineEdit()
- self.ok_btn = QtWidgets.QPushButton("Ok")
- self.cancel_btn = QtWidgets.QPushButton("Abbrechen")
- self.cancel_btn.setToolTip("Name der Spalte wird zum Index")
- self.buttonBox.addButton(self.ok_btn, self.buttonBox.YesRole)
- self.buttonBox.addButton(self.cancel_btn, self.buttonBox.RejectRole)
- self.ok_btn.clicked.connect(self.accept)
- self.cancel_btn.clicked.connect(self.reject)
- self.layout.addWidget(self.desclabel)
- self.layout.addWidget(self.header)
- self.layout.addWidget(self.buttonBox)
- self.setLayout(self.layout)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement