Advertisement
MushroomMaula

Untitled

Apr 26th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.11 KB | None | 0 0
  1. import csv
  2. import inspect
  3. import os
  4. from typing import Iterable, List
  5.  
  6. from PyQt5 import QtCore, QtGui, QtWidgets
  7.  
  8.  
  9. class BetterTable(QtWidgets.QTableWidget):
  10.  
  11.     filepath = os.path.dirname(inspect.getfile(inspect.currentframe()))
  12.  
  13.     def __init__(self, datafile=None):
  14.         super().__init__()
  15.         self.datafile = datafile
  16.         self.table_headers = []
  17.         self.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
  18.  
  19.     def setItem(self, row: int, column: int, item: str):
  20.         item = QtWidgets.QTableWidgetItem(item)
  21.         super().setItem(row, column, item)
  22.  
  23.     def setRow(self, rowindex: int, items: Iterable):
  24.         '''
  25.        sets Items to specified row
  26.        '''
  27.         if rowindex >= self.rowCount():
  28.             rowindex = self.rowCount()  # Appending at the end of the rows
  29.         items = list(map(str, items))
  30.  
  31.         for index in range(self.columnCount()):
  32.             try:
  33.                 self.setItem(rowindex, index, items[index])
  34.             except IndexError:
  35.                 break  # breaks loop because there are no more items
  36.  
  37.     def setColumn(self, columnindex: int, items: Iterable):
  38.         '''
  39.        sets items to specified column
  40.        '''
  41.         if columnindex >= self.columnCount():
  42.             columnindex = self.columnCount()  # Appending at the end of the columns
  43.         items = list(map(str, items))
  44.  
  45.         for index in range(self.rowCount()):
  46.             try:
  47.                 self.setItem(index, columnindex, items[index])
  48.             except IndexError:
  49.                 break  # breaks loop because there are no more items
  50.  
  51.     def addRow(self, index: int=None):
  52.         '''Inserts column at the end'''
  53.         if not index:
  54.             index = self.rowCount()
  55.         self.insertRow(index)
  56.  
  57.     def addColumn(self, index: int=None):
  58.         '''Inserts column at the end'''
  59.         if not index:
  60.             index = self.columnCount()
  61.         # show Dialog which asks for header name
  62.         dialog = HeaderDialog()
  63.         dialog.exec_()
  64.         if dialog.result():
  65.             self.insertColumn(index)
  66.  
  67.             header = dialog.header.text()
  68.             new_header = QtWidgets.QTableWidgetItem(header)
  69.             self.setHorizontalHeaderItem(index, new_header)
  70.             self.table_headers.append(header)
  71.  
  72.     def alignColumn(self, columnindex: int, alignment: QtCore.Qt.Alignment):
  73.         '''
  74.        aligns a whole column
  75.        '''
  76.         for index in range(self.rowCount()):
  77.             self.item(index, columnindex).setTextAlignment(alignment)
  78.  
  79.     def populate(self, data: List[List], headers: List[str]=None):
  80.         '''
  81.        Populates the table from a 2 dimensional array
  82.        '''
  83.         if not headers:
  84.             # set headers to first row of data
  85.             headers = data.pop(0)
  86.         self.table_headers.extend(headers)
  87.  
  88.         self.setRowCount(len(data))
  89.         if data:
  90.             self.setColumnCount(max([len(row) for row in data]))
  91.         else:
  92.             self.setColumnCount(len(self.table_headers))
  93.  
  94.         for rowindex, row in enumerate(data):
  95.             self.setRow(rowindex, row)
  96.  
  97.         self.setHorizontalHeaderLabels(headers)
  98.         self.resizeRowsToContents()
  99.         self.resizeColumnsToContents()
  100.  
  101.     def getRow(self, rowindex: int) -> List:
  102.         '''
  103.        returns a list with the Items of the row
  104.        '''
  105.         lst = []
  106.  
  107.         for index in range(self.columnCount()):
  108.             lst.append(self.item(rowindex, index).text())
  109.  
  110.         return lst
  111.  
  112.     def getColumn(self, columnindex: int) -> List:
  113.         '''
  114.        returns a list with the Items of the column
  115.        '''
  116.         lst = []
  117.  
  118.         for index in range(self.rowCount()):
  119.             lst.append(self.item(index, columnindex).text())
  120.  
  121.         return lst
  122.  
  123.     def closeEvent(self, event: QtCore.QEvent):
  124.         self.save()
  125.         event.accept()
  126.  
  127.     def save(self):
  128.         if not bool(self.datafile):
  129.             filedialog = QtWidgets.QFileDialog()
  130.             filedata = filedialog.getSaveFileName(caption="Save file",
  131.                                                 directory=self.filepath,
  132.                                                 filter="Character Seperated Values(*.csv)"
  133.                                                 )
  134.  
  135.             if filedata[0]:  # bool('') == False / canceling Filedata will return ('','')
  136.                 filepath = filedata[0]
  137.         else:
  138.             filepath = os.path.join(self.filepath, self.datafile)
  139.  
  140.         table = []
  141.         table.append(self.table_headers)
  142.  
  143.         for rowindex in range(self.rowCount()):
  144.             table.append(self.getRow(rowindex))
  145.        
  146.         if filepath and table:
  147.             # newline is required because csv will add blank line
  148.             with open(filepath, 'w', newline='', encoding='utf-8') as file:
  149.                 writer = csv.writer(file)
  150.                 writer.writerows(table)
  151.  
  152.         else:
  153.             print("either table or filepath is nonexistend")
  154.  
  155. class HeaderDialog(QtWidgets.QDialog):
  156.  
  157.     def __init__(self):
  158.         # removes Icon, Help and Close Buttons
  159.         super().__init__(None,
  160.                          QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint
  161.                         )
  162.         self.setWindowTitle("Spalten Name")
  163.         self.layout = QtWidgets.QHBoxLayout()
  164.         self.buttonBox = QtWidgets.QDialogButtonBox()
  165.  
  166.         self.desclabel = QtWidgets.QLabel("Spalten Name:")
  167.         self.header = QtWidgets.QLineEdit()
  168.  
  169.         self.ok_btn = QtWidgets.QPushButton("Ok")
  170.         self.cancel_btn = QtWidgets.QPushButton("Abbrechen")
  171.         self.cancel_btn.setToolTip("Name der Spalte wird zum Index")
  172.         self.buttonBox.addButton(self.ok_btn, self.buttonBox.YesRole)
  173.         self.buttonBox.addButton(self.cancel_btn, self.buttonBox.RejectRole)
  174.         self.ok_btn.clicked.connect(self.accept)
  175.         self.cancel_btn.clicked.connect(self.reject)
  176.  
  177.         self.layout.addWidget(self.desclabel)
  178.         self.layout.addWidget(self.header)
  179.         self.layout.addWidget(self.buttonBox)
  180.  
  181.         self.setLayout(self.layout)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement