errmsg = u'{0}: \n{1}'.format(excType, excValueStr)
    sections = [
        u'\n', separator, timeString, separator, errmsg, separator, tbinfo
    ]
    msg = u'\n'.join(sections)
    try:
        f = codecs.open(logFile, "a+", encoding='utf-8')
        f.write(msg)
        f.close()
    except IOError, e:
        msgbox(u"unable to write to {0}".format(logFile), u"Writing error")

    # always show an error message
    try:
        if not _isQAppRunning():
            app = QtGui.QApplication([])
        _showMessageBox(unicode(notice) + unicode(msg))
    except:
        msgbox(unicode(notice) + unicode(msg), u"Error")


def _isQAppRunning():
    if QtGui.QApplication.instance() is None:
        return False
    else:
        return True


def _showMessageBox(text):
    errorbox = QtGui.QMessageBox()
    errorbox.setText(text)
    def goToColumn(self):
        print "go to column 7"
        index = self.dataTableView.view().model().index(7, 0)
        self.dataTableView.view().setCurrentIndex(index)

    def changeColumnValue(self, columnName, index, dtype):
        print "failed to change", columnName, "to", dtype
        print index.data(), index.isValid()
        self.dataTableView.view().setCurrentIndex(index)

    def setFilter(self):
        #filterIndex = eval(self.lineEditFilterCondition.text())
        search = DataSearch("Test", self.lineEditFilterCondition.text())
        self.dataTableView.view().model().setFilter(search)
        #raise NotImplementedError

    def clearFilter(self):
        self.dataTableView.view().model().clearFilter()


if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    widget = TestWidget()
    widget.show()

    widget.setDataFrame(getCsvData())

    #widget.setDataFrame( getRandomData(2, 2) )

    app.exec_()