コード例 #1
0
    def __init__(self, parent=None, plot=None):
        TableWidget.__init__(self, parent)
        _StatsWidgetBase.__init__(self,
                                  statsOnVisibleData=False,
                                  displayOnlyActItem=False)

        # Init for _displayOnlyActItem == False
        assert self._displayOnlyActItem is False
        self.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
        self.setSelectionMode(qt.QAbstractItemView.SingleSelection)
        self.currentItemChanged.connect(self._currentItemChanged)

        self.setRowCount(0)
        self.setColumnCount(2)

        # Init headers
        headerItem = qt.QTableWidgetItem('Legend')
        headerItem.setData(qt.Qt.UserRole, self._LEGEND_HEADER_DATA)
        self.setHorizontalHeaderItem(0, headerItem)
        headerItem = qt.QTableWidgetItem('Kind')
        headerItem.setData(qt.Qt.UserRole, self._KIND_HEADER_DATA)
        self.setHorizontalHeaderItem(1, headerItem)

        self.setSortingEnabled(True)
        self.setPlot(plot)
コード例 #2
0
    def __init__(self, parent, plot):
        TableWidget.__init__(self, parent)
        _StatsWidgetBase.__init__(self,
                                  statsOnVisibleData=False,
                                  displayOnlyActItem=False)
        self.__region_edition_callback = {}
        """We need to keep trace of the roi signals connection because
        the roi emits the sigChanged during roi edition"""
        self._items = {}
        self.setRowCount(0)
        self.setColumnCount(3)

        # Init headers
        headerItem = qt.QTableWidgetItem(self._LEGEND_HEADER_DATA.title())
        headerItem.setData(qt.Qt.UserRole, self._LEGEND_HEADER_DATA)
        self.setHorizontalHeaderItem(0, headerItem)
        headerItem = qt.QTableWidgetItem(self._KIND_HEADER_DATA.title())
        headerItem.setData(qt.Qt.UserRole, self._KIND_HEADER_DATA)
        self.setHorizontalHeaderItem(1, headerItem)
        headerItem = qt.QTableWidgetItem(self._ROI_HEADER_DATA.title())
        headerItem.setData(qt.Qt.UserRole, self._ROI_HEADER_DATA)
        self.setHorizontalHeaderItem(2, headerItem)

        self.setSortingEnabled(True)
        self.setPlot(plot)

        self.__plotItemToItems = {}
        """Key is plotItem, values is list of __RoiStatsItemWidget"""
        self.__roiToItems = {}
        """Key is roi, values is list of __RoiStatsItemWidget"""
        self.__roisKeyToRoi = {}
コード例 #3
0
    def __init__(self, *args, **kwargs):
        super(SampleTable, self).__init__(*args, **kwargs)

        self.mainLayout = qt.QVBoxLayout(self)
        self.setLayout(self.mainLayout)

        self.lbl = np.array([])
        self.data = np.array([])
        self.df = None
        self.column_labels = None
        self.filename = None

        self.addBtn = qt.QPushButton(self)
        self.addBtn.setFixedWidth(30)
        self.addBtn.setFixedHeight(30)
        self.addBtn.setIcon(getQIcon('shape-cross'))
        self.addBtn.setToolTip("Add sample below")
        self.addBtn.clicked.connect(self.addRecord)

        self.minusBtn = qt.QPushButton(self)
        self.minusBtn.setFixedWidth(30)
        self.minusBtn.setFixedHeight(30)
        self.minusBtn.setIcon(getQIcon('close'))
        self.minusBtn.setToolTip("Remove current row")
        self.minusBtn.clicked.connect(self.removeRecord)

        self.loadBtn = qt.QPushButton(self)
        self.loadBtn.setFixedWidth(30)
        self.loadBtn.setFixedHeight(30)
        self.loadBtn.setIcon(getQIcon('document-open'))
        self.loadBtn.clicked.connect(self.load)
        self.loadBtn.setToolTip("Load from the excel file")

        self.saveBtn = qt.QPushButton(self)
        self.saveBtn.setFixedWidth(30)
        self.saveBtn.setFixedHeight(30)
        self.saveBtn.setIcon(getQIcon('document-save'))
        self.saveBtn.clicked.connect(self.save)
        self.saveBtn.setToolTip("Save to the excel file")

        buttons = addWidgets(
            [self.addBtn, self.minusBtn, self.loadBtn, self.saveBtn],
            align='right')

        self.table = TableWidget(self)
        self.table.setAlternatingRowColors(True)
        # self.table.horizontalHeader().setSectionResizeMode(qt.QHeaderView.Stretch)

        self.mainLayout.addWidget(buttons)
        self.mainLayout.addWidget(self.table)
コード例 #4
0
ファイル: StatsWidget.py プロジェクト: vallsv/silx
    def __init__(self, parent=None, plot=None):
        TableWidget.__init__(self, parent)
        """Next freeID for the curve"""
        self.plot = None
        self._displayOnlyActItem = False
        self._statsOnVisibleData = False
        self._lgdAndKindToItems = {}
        """Associate to a tuple(legend, kind) the items legend"""
        self.callbackImage = None
        self.callbackScatter = None
        self.callbackCurve = None
        """Associate the curve legend to his first item"""
        self._statsHandler = None
        self._legendsSet = []
        """list of legends actually displayed"""
        self._resetColumns()

        self.setColumnCount(len(self._columns))
        self.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
        self.setPlot(plot)
        self.setSortingEnabled(True)
コード例 #5
0
ファイル: StatsWidget.py プロジェクト: WuZifan/silx
    def __init__(self, parent=None, plot=None):
        TableWidget.__init__(self, parent)
        """Next freeID for the curve"""
        self.plot = None
        self._displayOnlyActItem = False
        self._statsOnVisibleData = False
        self._lgdAndKindToItems = {}
        """Associate to a tuple(legend, kind) the items legend"""
        self.callbackImage = None
        self.callbackScatter = None
        self.callbackCurve = None
        """Associate the curve legend to his first item"""
        self._statsHandler = None
        self._legendsSet = []
        """list of legends actually displayed"""
        self._resetColumns()

        self.setColumnCount(len(self._columns))
        self.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
        self.setPlot(plot)
        self.setSortingEnabled(True)
コード例 #6
0
    def __init__(self, *args, **kwargs):
        super(TableWindow, self).__init__(*args, **kwargs)

        self.mainLayout = qt.QVBoxLayout(self)
        self.setLayout(self.mainLayout)

        self.lbl = np.array([])
        self.data = np.array([])
        self.df = None
        self.column_labels = None
        self.filename = None

        self.loadBtn = qt.QPushButton(self)
        self.loadBtn.setFixedWidth(30)
        self.loadBtn.setFixedHeight(30)
        self.loadBtn.setIcon(getQIcon('document-open'))
        self.loadBtn.clicked.connect(self.load)

        self.saveBtn = qt.QPushButton(self)
        self.saveBtn.setFixedWidth(30)
        self.saveBtn.setFixedHeight(30)
        self.saveBtn.setIcon(getQIcon('document-save'))
        self.saveBtn.clicked.connect(self.save)

        self.loadDefaultBtn = qt.QPushButton(self)
        self.loadDefaultBtn.setFixedWidth(130)
        self.loadDefaultBtn.setFixedHeight(30)
        self.loadDefaultBtn.setText('Load Default')
        self.loadDefaultBtn.clicked.connect(self.loadDefault)

        buttons = addWidgets([self.loadBtn, self.saveBtn, self.loadDefaultBtn],
                             align='right')
        self.table = TableWidget(self)
        self.table.setAlternatingRowColors(True)
        self.table.horizontalHeader().setSectionResizeMode(
            qt.QHeaderView.Stretch)
        # self.table.verticalHeader().setVisible(False)

        self.mainLayout.addWidget(buttons)
        self.mainLayout.addWidget(self.table)
コード例 #7
0
ファイル: StatsWidget.py プロジェクト: dnaudet/silx
    def __init__(self, parent=None, plot=None):
        TableWidget.__init__(self, parent)
        _StatsWidgetBase.__init__(self, statsOnVisibleData=False,
                                  displayOnlyActItem=False)

        # Init for _displayOnlyActItem == False
        assert self._displayOnlyActItem is False
        self.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
        self.setSelectionMode(qt.QAbstractItemView.SingleSelection)
        self.currentItemChanged.connect(self._currentItemChanged)

        self.setRowCount(0)
        self.setColumnCount(2)

        # Init headers
        headerItem = qt.QTableWidgetItem('Legend')
        headerItem.setData(qt.Qt.UserRole, self._LEGEND_HEADER_DATA)
        self.setHorizontalHeaderItem(0, headerItem)
        headerItem = qt.QTableWidgetItem('Kind')
        headerItem.setData(qt.Qt.UserRole, self._KIND_HEADER_DATA)
        self.setHorizontalHeaderItem(1, headerItem)

        self.setSortingEnabled(True)
        self.setPlot(plot)
コード例 #8
0
 def __init__(self, parent, numRows, numColumns, legList, motList):
     TableWidget.__init__(self, parent)
     self.setRowCount(0)
     self.setColumnCount(numColumns)
     self.currentComboBox = 1
     self.legendsList = legList
     self.motorsList = motList
     self.motorNamesList = self.getAllMotorNames()
     self.motorNamesList.sort()
     self.infoDict = dict(zip(self.legendsList, self.motorsList))
     self.header = MotorInfoHeader(self)
     self.setHorizontalHeader(self.header)
     self.setHorizontalHeaderItem(0, qt.QTableWidgetItem('Legend'))
     self.setSortingEnabled(True)
     self.verticalHeader().hide()
     self.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
     self.setShowGrid(False)
     for idx in range(len(self.legendsList)):
         curveLegend = self.legendsList[idx]
         self.insertRow(idx)
         self.setItem(idx, 0, curveLegend)
         for jdx in range(1, self.columnCount()):
             self.setItem(0, jdx, '')
     self.sortByColumn(0, qt.Qt.AscendingOrder)
コード例 #9
0
ファイル: MotorInfoWindow.py プロジェクト: maurov/pymca
 def __init__(self, parent, numRows, numColumns, legList, motList):
     TableWidget.__init__(self, parent)
     self.setRowCount(0)
     self.setColumnCount(numColumns)
     self.currentComboBox = 1
     self.legendsList = legList
     self.motorsList  = motList
     self.motorNamesList = self.getAllMotorNames()
     self.motorNamesList.sort()
     self.infoDict = dict( zip( self.legendsList, self.motorsList ) )
     self.header = MotorInfoHeader(self)
     self.setHorizontalHeader(self.header)
     self.setHorizontalHeaderItem(0, qt.QTableWidgetItem('Legend'))
     self.setSortingEnabled(True)
     self.verticalHeader().hide()
     self.setSelectionBehavior(qt.QAbstractItemView.SelectRows)
     self.setShowGrid(False)
     for idx in range(len(self.legendsList)):
         curveLegend = self.legendsList[idx]
         self.insertRow(idx)
         self.setItem(idx, 0, curveLegend )
         for jdx in range(1, self.columnCount()):
             self.setItem(0, jdx, '')
     self.sortByColumn(0, qt.Qt.AscendingOrder)
コード例 #10
0
ファイル: UrlSelectionTable.py プロジェクト: dnaudet/silx
 def __init__(self, parent=None):
     TableWidget.__init__(self, parent)
     self.clear()
コード例 #11
0
 def __init__(self, parent=None):
     TableWidget.__init__(self, parent)
     self.clear()
コード例 #12
0
 def testShow(self):
     table = TableWidget()
     table.setColumnCount(10)
     table.setRowCount(7)
     table.enableCut()
     table.enablePaste()
     table.show()
     table.hide()
     self.qapp.processEvents()
コード例 #13
0
    def __init__(self, parent=None, paramlist=None):
        TableWidget.__init__(self, parent)
        self.setContentsMargins(0, 0, 0, 0)

        labels = [
            'Parameter', 'Estimation', 'Fit Value', 'Sigma', 'Constraints',
            'Min/Parame', 'Max/Factor/Delta'
        ]
        tooltips = [
            "Fit parameter name",
            "Estimated value for fit parameter. You can edit this column.",
            "Actual value for parameter, after fit",
            "Uncertainty (same unit as the parameter)",
            "Constraint to be applied to the parameter for fit",
            "First parameter for constraint (name of another param or min value)",
            "Second parameter for constraint (max value, or factor/delta)"
        ]

        self.columnKeys = [
            'name', 'estimation', 'fitresult', 'sigma', 'code', 'val1', 'val2'
        ]
        """This list assigns shorter keys to refer to columns than the
        displayed labels."""

        self.__configuring = False

        # column headers and associated tooltips
        self.setColumnCount(len(labels))

        for i, label in enumerate(labels):
            item = self.horizontalHeaderItem(i)
            if item is None:
                item = qt.QTableWidgetItem(label, qt.QTableWidgetItem.Type)
                self.setHorizontalHeaderItem(i, item)

            item.setText(label)
            if tooltips is not None:
                item.setToolTip(tooltips[i])

        # resize columns
        for col_key in ["name", "estimation", "sigma", "val1", "val2"]:
            col_idx = self.columnIndexByField(col_key)
            self.resizeColumnToContents(col_idx)

        # Initialize the table with one line per supplied parameter
        paramlist = paramlist if paramlist is not None else []
        self.parameters = OrderedDict()
        """This attribute stores all the data in an ordered dictionary.
        New data can be added using :meth:`newParameterLine`.
        Existing data can be modified using :meth:`configureLine`

        Keys of the dictionary are:

            -  'name': parameter name
            -  'line': line index for the parameter in the table
            -  'estimation'
            -  'fitresult'
            -  'sigma'
            -  'code': constraint code (one of the elements of
                :attr:`code_options`)
            -  'val1': first parameter related to constraint, formatted
                as a string, as typed in the table
            -  'val2': second parameter related to constraint, formatted
                as a string, as typed in the table
            -  'cons1': scalar representation of 'val1'
                (e.g. when val1 is the name of a fit parameter, cons1
                will be the line index of this parameter)
            -  'cons2': scalar representation of 'val2'
            -  'vmin': equal to 'val1' when 'code' is "QUOTED"
            -  'vmax': equal to 'val2' when 'code' is "QUOTED"
            -  'relatedto': name of related parameter when this parameter
                is constrained to another parameter (same as 'val1')
            -  'factor': same as 'val2' when 'code' is 'FACTOR'
            -  'delta': same as 'val2' when 'code' is 'DELTA'
            -  'sum': same as 'val2' when 'code' is 'SUM'
            -  'group': group index for the parameter
            -  'xmin': data range minimum
            -  'xmax': data range maximum
        """
        for line, param in enumerate(paramlist):
            self.newParameterLine(param, line)

        self.code_options = [
            "FREE", "POSITIVE", "QUOTED", "FIXED", "FACTOR", "DELTA", "SUM",
            "IGNORE", "ADD"
        ]
        """Possible values in the combo boxes in the 'Constraints' column.
        """

        # connect signal
        self.cellChanged[int, int].connect(self.onCellChanged)
コード例 #14
0
ファイル: test_tablewidget.py プロジェクト: dnaudet/silx
 def testShow(self):
     table = TableWidget()
     table.setColumnCount(10)
     table.setRowCount(7)
     table.enableCut()
     table.enablePaste()
     table.show()
     table.hide()
     self.qapp.processEvents()
コード例 #15
0
class TableWindow(qt.QWidget):
    """
    Customized ArrayTableWidget from silx.gui.data.ArrayTableWidget
    """
    def __init__(self, *args, **kwargs):
        super(TableWindow, self).__init__(*args, **kwargs)

        self.mainLayout = qt.QVBoxLayout(self)
        self.setLayout(self.mainLayout)

        self.lbl = np.array([])
        self.data = np.array([])
        self.df = None
        self.column_labels = None
        self.filename = None

        self.loadBtn = qt.QPushButton(self)
        self.loadBtn.setFixedWidth(30)
        self.loadBtn.setFixedHeight(30)
        self.loadBtn.setIcon(getQIcon('document-open'))
        self.loadBtn.clicked.connect(self.load)

        self.saveBtn = qt.QPushButton(self)
        self.saveBtn.setFixedWidth(30)
        self.saveBtn.setFixedHeight(30)
        self.saveBtn.setIcon(getQIcon('document-save'))
        self.saveBtn.clicked.connect(self.save)

        self.loadDefaultBtn = qt.QPushButton(self)
        self.loadDefaultBtn.setFixedWidth(130)
        self.loadDefaultBtn.setFixedHeight(30)
        self.loadDefaultBtn.setText('Load Default')
        self.loadDefaultBtn.clicked.connect(self.loadDefault)

        buttons = addWidgets([self.loadBtn, self.saveBtn, self.loadDefaultBtn],
                             align='right')
        self.table = TableWidget(self)
        self.table.setAlternatingRowColors(True)
        self.table.horizontalHeader().setSectionResizeMode(
            qt.QHeaderView.Stretch)
        # self.table.verticalHeader().setVisible(False)

        self.mainLayout.addWidget(buttons)
        self.mainLayout.addWidget(self.table)

    def loadDefault(self):
        filename = 'gap_and_taper_orig.xlsx'
        if os.path.exists(filename):
            try:
                self.df = loadExcel(filename)
                self.column_labels = list(self.df.columns)
                self.lbl, self.data = toArray(self.df)

                if len(self.lbl):
                    self.setData()
            except:
                print("not available")

    def load(self, filename=None):
        if filename:
            self.filename = filename

        # pandas dataFrame
        if os.path.exists(self.filename):
            try:
                self.df = loadExcel(self.filename)
                self.column_labels = list(self.df.columns)
                self.lbl, self.data = toArray(self.df)

                if len(self.lbl):
                    self.setData()
            except:
                print("not available")

    def save(self):
        self.getData()
        saveExcel(self.filename, self.df)

        self.load()

    def highlight(self, item):
        font = qt.QFont("Verdana")
        font.setBold(True)
        item.setFont(font)

        brush = qt.QBrush(qt.Qt.red)
        item.setForeground(brush)

    def setData(self):
        try:
            self.table.itemChanged.disconnect()
        except:
            pass

        # Delete data
        self.table.setRowCount(0)

        self.table.setColumnCount(len(self.column_labels))
        self.table.setHorizontalHeaderLabels(self.column_labels)

        for row, label in enumerate(self.lbl):
            self.table.insertRow(row)
            item = qt.QTableWidgetItem(label)
            item.setTextAlignment(qt.Qt.AlignCenter | qt.Qt.AlignVCenter)
            self.table.setItem(row, 0, item)

            for n, data in enumerate(self.data[row]):
                item = qt.QTableWidgetItem(str(data))
                item.setTextAlignment(qt.Qt.AlignCenter | qt.Qt.AlignVCenter)
                self.table.setItem(row, n + 1, item)

        self.table.itemChanged.connect(self.highlight)

    def getData(self):
        rows = self.table.rowCount()
        cols = self.table.columnCount()

        self.lbl = []
        self.data = []
        for row in range(rows):
            temp = []
            for col in range(cols):
                if col == 0:
                    self.lbl.append(self.table.item(row, col).text())

                else:
                    temp.append(float(self.table.item(row, col).text()))
            self.data.append(temp)

        # To numpy array
        self.data = np.array(self.data)

        # To DataFrame
        df = pd.DataFrame()
        for n, label in enumerate(self.column_labels):
            if n == 0:
                df[label] = self.lbl
            else:
                df[label] = self.data[:, n - 1]

        self.df = df

        return self.lbl, self.data
コード例 #16
0
ファイル: Parameters.py プロジェクト: silx-kit/silx
    def __init__(self, parent=None, paramlist=None):
        TableWidget.__init__(self, parent)
        self.setContentsMargins(0, 0, 0, 0)

        labels = ['Parameter', 'Estimation', 'Fit Value', 'Sigma',
                  'Constraints', 'Min/Parame', 'Max/Factor/Delta']
        tooltips = ["Fit parameter name",
                    "Estimated value for fit parameter. You can edit this column.",
                    "Actual value for parameter, after fit",
                    "Uncertainty (same unit as the parameter)",
                    "Constraint to be applied to the parameter for fit",
                    "First parameter for constraint (name of another param or min value)",
                    "Second parameter for constraint (max value, or factor/delta)"]

        self.columnKeys = ['name', 'estimation', 'fitresult',
                           'sigma', 'code', 'val1', 'val2']
        """This list assigns shorter keys to refer to columns than the
        displayed labels."""

        self.__configuring = False

        # column headers and associated tooltips
        self.setColumnCount(len(labels))

        for i, label in enumerate(labels):
            item = self.horizontalHeaderItem(i)
            if item is None:
                item = qt.QTableWidgetItem(label,
                                           qt.QTableWidgetItem.Type)
                self.setHorizontalHeaderItem(i, item)

            item.setText(label)
            if tooltips is not None:
                item.setToolTip(tooltips[i])

        # resize columns
        for col_key in ["name", "estimation", "sigma", "val1", "val2"]:
            col_idx = self.columnIndexByField(col_key)
            self.resizeColumnToContents(col_idx)

        # Initialize the table with one line per supplied parameter
        paramlist = paramlist if paramlist is not None else []
        self.parameters = OrderedDict()
        """This attribute stores all the data in an ordered dictionary.
        New data can be added using :meth:`newParameterLine`.
        Existing data can be modified using :meth:`configureLine`

        Keys of the dictionary are:

            -  'name': parameter name
            -  'line': line index for the parameter in the table
            -  'estimation'
            -  'fitresult'
            -  'sigma'
            -  'code': constraint code (one of the elements of
                :attr:`code_options`)
            -  'val1': first parameter related to constraint, formatted
                as a string, as typed in the table
            -  'val2': second parameter related to constraint, formatted
                as a string, as typed in the table
            -  'cons1': scalar representation of 'val1'
                (e.g. when val1 is the name of a fit parameter, cons1
                will be the line index of this parameter)
            -  'cons2': scalar representation of 'val2'
            -  'vmin': equal to 'val1' when 'code' is "QUOTED"
            -  'vmax': equal to 'val2' when 'code' is "QUOTED"
            -  'relatedto': name of related parameter when this parameter
                is constrained to another parameter (same as 'val1')
            -  'factor': same as 'val2' when 'code' is 'FACTOR'
            -  'delta': same as 'val2' when 'code' is 'DELTA'
            -  'sum': same as 'val2' when 'code' is 'SUM'
            -  'group': group index for the parameter
            -  'xmin': data range minimum
            -  'xmax': data range maximum
        """
        for line, param in enumerate(paramlist):
            self.newParameterLine(param, line)

        self.code_options = ["FREE", "POSITIVE", "QUOTED", "FIXED",
                             "FACTOR", "DELTA", "SUM", "IGNORE", "ADD"]
        """Possible values in the combo boxes in the 'Constraints' column.
        """

        # connect signal
        self.cellChanged[int, int].connect(self.onCellChanged)
コード例 #17
0
class SampleTable(qt.QWidget):
    """
    Customized ArrayTableWidget from silx.gui.data.ArrayTableWidget
    """
    def __init__(self, *args, **kwargs):
        super(SampleTable, self).__init__(*args, **kwargs)

        self.mainLayout = qt.QVBoxLayout(self)
        self.setLayout(self.mainLayout)

        self.lbl = np.array([])
        self.data = np.array([])
        self.df = None
        self.column_labels = None
        self.filename = None

        self.addBtn = qt.QPushButton(self)
        self.addBtn.setFixedWidth(30)
        self.addBtn.setFixedHeight(30)
        self.addBtn.setIcon(getQIcon('shape-cross'))
        self.addBtn.setToolTip("Add sample below")
        self.addBtn.clicked.connect(self.addRecord)

        self.minusBtn = qt.QPushButton(self)
        self.minusBtn.setFixedWidth(30)
        self.minusBtn.setFixedHeight(30)
        self.minusBtn.setIcon(getQIcon('close'))
        self.minusBtn.setToolTip("Remove current row")
        self.minusBtn.clicked.connect(self.removeRecord)

        self.loadBtn = qt.QPushButton(self)
        self.loadBtn.setFixedWidth(30)
        self.loadBtn.setFixedHeight(30)
        self.loadBtn.setIcon(getQIcon('document-open'))
        self.loadBtn.clicked.connect(self.load)
        self.loadBtn.setToolTip("Load from the excel file")

        self.saveBtn = qt.QPushButton(self)
        self.saveBtn.setFixedWidth(30)
        self.saveBtn.setFixedHeight(30)
        self.saveBtn.setIcon(getQIcon('document-save'))
        self.saveBtn.clicked.connect(self.save)
        self.saveBtn.setToolTip("Save to the excel file")

        buttons = addWidgets(
            [self.addBtn, self.minusBtn, self.loadBtn, self.saveBtn],
            align='right')

        self.table = TableWidget(self)
        self.table.setAlternatingRowColors(True)
        # self.table.horizontalHeader().setSectionResizeMode(qt.QHeaderView.Stretch)

        self.mainLayout.addWidget(buttons)
        self.mainLayout.addWidget(self.table)

    def addRecord(self):
        currentRow = self.table.currentRow()
        self.table.insertRow(currentRow + 1)
        item = qt.QTableWidgetItem("SampleName")
        item.setTextAlignment(qt.Qt.AlignCenter | qt.Qt.AlignVCenter)
        self.table.setItem(currentRow + 1, 0, item)

        for n, data in enumerate([1, 1]):
            item = qt.QTableWidgetItem(str(data))
            item.setTextAlignment(qt.Qt.AlignCenter | qt.Qt.AlignVCenter)
            self.table.setItem(currentRow + 1, n + 1, item)

        self.table.itemChanged.connect(self.check_validity)

    def removeRecord(self):
        currentRow = self.table.currentRow()
        self.table.removeRow(currentRow)

        self.table.itemChanged.connect(self.check_validity)

    def load(self, filename=None):
        if filename:
            self.filename = filename

        # pandas dataFrame
        if os.path.exists(self.filename):
            try:
                self.df = loadExcel(self.filename)
                self.column_labels = list(self.df.columns)
                self.lbl, self.data = toArray(self.df)

                if len(self.lbl):
                    self.setData()
            except:
                print("not available")

    def save(self):
        self.getData()
        saveExcel(self.filename, self.df)

        self.load()

    def check_validity(self, item):
        text = item.text()
        if item.column() == 0:
            match = re.findall('[a-zA-Z0-9_]+', text)
        elif item.column() == 1:
            match = re.findall('[0-9]+', text)
            if len(match):
                if int(''.join(match)) > 390:
                    match = ['390']
            else:
                match = ['0']
        else:
            match = re.findall('[0-9]+', text)
            if not len(match):
                match = ['1']

        item.setText(''.join(match))

    def setData(self):
        try:
            self.table.itemChanged.disconnect()
        except:
            pass

        # Delete data
        self.table.setRowCount(0)

        self.table.setColumnCount(len(self.column_labels))
        self.table.setHorizontalHeaderLabels(self.column_labels)

        for row, label in enumerate(self.lbl):
            self.table.insertRow(row)
            item = qt.QTableWidgetItem(label)
            item.setTextAlignment(qt.Qt.AlignCenter | qt.Qt.AlignVCenter)
            self.table.setItem(row, 0, item)

            for n, data in enumerate(self.data[row]):
                item = qt.QTableWidgetItem(str(data))
                item.setTextAlignment(qt.Qt.AlignCenter | qt.Qt.AlignVCenter)
                self.table.setItem(row, n + 1, item)

        self.table.itemChanged.connect(self.check_validity)

    def getData(self):
        rows = self.table.rowCount()
        cols = self.table.columnCount()

        self.lbl = []
        self.data = []
        for row in range(rows):
            temp = []
            for col in range(cols):
                if col == 0:
                    self.lbl.append(self.table.item(row, col).text())

                else:
                    temp.append(float(self.table.item(row, col).text()))
            self.data.append(temp)

        # To numpy array
        self.data = np.array(self.data)

        # To DataFrame
        df = pd.DataFrame()
        for n, label in enumerate(self.column_labels):
            if n == 0:
                df[label] = self.lbl
            else:
                df[label] = self.data[:, n - 1]

        self.df = df

        return self.lbl, self.data