def pbSave_clicked(self): """ save time budget analysis results in TSV, CSV, ODS, XLS format """ def complete(l, max): """ complete list with empty string until len = max """ while len(l) < max: l.append("") return l logging.debug("save time budget results to file") extended_file_formats = [ "Tab Separated Values (*.tsv)", "Comma Separated Values (*.csv)", "Open Document Spreadsheet ODS (*.ods)", "Microsoft Excel Spreadsheet XLSX (*.xlsx)", "Legacy Microsoft Excel Spreadsheet XLS (*.xls)", "HTML (*.html)" ] file_formats = ["tsv", "csv", "ods", "xlsx", "xls", "html"] if QT_VERSION_STR[0] == "4": filediag_func = QFileDialog(self).getSaveFileNameAndFilter else: filediag_func = QFileDialog(self).getSaveFileName fileName, filter_ = filediag_func(self, "Save Time budget analysis", "", ";;".join(extended_file_formats)) if not fileName: return outputFormat = file_formats[extended_file_formats.index(filter_)] if pathlib.Path(fileName).suffix != "." + outputFormat: fileName = str(pathlib.Path(fileName)) + "." + outputFormat if fileName: rows = [] # observations list rows.append(["Observations:"]) for idx in range(self.lw.count()): rows.append([""]) rows.append([self.lw.item(idx).text()]) if INDEPENDENT_VARIABLES in self.pj[OBSERVATIONS][self.lw.item( idx).text()]: rows.append(["Independent variables:"]) for var in self.pj[OBSERVATIONS][self.lw.item( idx).text()][INDEPENDENT_VARIABLES]: rows.append([ var, self.pj[OBSERVATIONS][self.lw.item( idx).text()][INDEPENDENT_VARIABLES][var] ]) rows.extend([[""], [""], ["Time budget:"]]) # write header cols = [] for col in range(self.twTB.columnCount()): cols.append(self.twTB.horizontalHeaderItem(col).text()) rows.append(cols) rows.append([""]) for row in range(self.twTB.rowCount()): values = [] for col in range(self.twTB.columnCount()): values.append(intfloatstr(self.twTB.item(row, col).text())) rows.append(values) maxLen = max([len(r) for r in rows]) data = tablib.Dataset() data.title = "Time budget" for row in rows: data.append(complete(row, maxLen)) if outputFormat in ["tsv", "csv", "html"]: with open(fileName, "wb") as f: f.write(str.encode(data.export(outputFormat))) return if outputFormat in ["ods", "xlsx", "xls"]: with open(fileName, "wb") as f: f.write(data.export(outputFormat)) return
def pbSave_clicked(self): """ save time budget analysis results in TSV, CSV, ODS, XLS format """ def complete(l: list, max_: int) -> list: """ complete list with empty string until len = max Args: l (list): list to complete max_ (int): length of the returned list Returns: list: completed list """ while len(l) < max_: l.append("") return l logging.debug("save time budget results to file") extended_file_formats = [ "Tab Separated Values (*.tsv)", "Comma Separated Values (*.csv)", "Open Document Spreadsheet ODS (*.ods)", "Microsoft Excel Spreadsheet XLSX (*.xlsx)", "Legacy Microsoft Excel Spreadsheet XLS (*.xls)", "HTML (*.html)" ] file_formats = ["tsv", "csv", "ods", "xlsx", "xls", "html"] file_name, filter_ = QFileDialog().getSaveFileName( self, "Save Time budget analysis", "", ";;".join(extended_file_formats)) if not file_name: return outputFormat = file_formats[extended_file_formats.index(filter_)] if pathlib.Path(file_name).suffix != "." + outputFormat: file_name = str(pathlib.Path(file_name)) + "." + outputFormat # check if file with new extension already exists if pathlib.Path(file_name).is_file(): if dialog.MessageDialog( programName, f"The file {file_name} already exists.", [CANCEL, OVERWRITE]) == CANCEL: return rows = [] # 1 observation if (self.lw.count() == 1 and self.config_param.get( TIME_BUDGET_FORMAT, DEFAULT_TIME_BUDGET_FORMAT) == COMPACT_TIME_BUDGET_FORMAT): col1, indep_var_label = [], [] # add obs id col1.append(self.lw.item(0).text()) # add obs date col1.append(self.pj[OBSERVATIONS][self.lw.item(0).text()].get( "date", "")) # description col1.append( utilities.eol2space( self.pj[OBSERVATIONS][self.lw.item(0).text()].get( DESCRIPTION, ""))) header = ["Observation id", "Observation date", "Description"] # indep var for var in self.pj[OBSERVATIONS][self.lw.item(0).text()].get( INDEPENDENT_VARIABLES, {}): indep_var_label.append(var) col1.append(self.pj[OBSERVATIONS][self.lw.item(0).text()] [INDEPENDENT_VARIABLES][var]) header.extend(indep_var_label) col1.extend([ f"{self.min_time:0.3f}", f"{self.max_time:0.3f}", f"{self.max_time - self.min_time:0.3f}" ]) header.extend([ "Time budget start", "Time budget stop", "Time budget duration" ]) for col_idx in range(self.twTB.columnCount()): header.append(self.twTB.horizontalHeaderItem(col_idx).text()) rows.append(header) for row_idx in range(self.twTB.rowCount()): values = [] for col_idx in range(self.twTB.columnCount()): values.append( intfloatstr(self.twTB.item(row_idx, col_idx).text())) rows.append(col1 + values) else: # observations list rows.append(["Observations:"]) for idx in range(self.lw.count()): rows.append([""]) rows.append(["Observation id", self.lw.item(idx).text()]) rows.append([ "Observation date", self.pj[OBSERVATIONS][self.lw.item(idx).text()].get( "date", "") ]) rows.append([ "Description", utilities.eol2space( self.pj[OBSERVATIONS][self.lw.item(idx).text()].get( DESCRIPTION, "")) ]) if INDEPENDENT_VARIABLES in self.pj[OBSERVATIONS][self.lw.item( idx).text()]: rows.append(["Independent variables:"]) for var in self.pj[OBSERVATIONS][self.lw.item( idx).text()][INDEPENDENT_VARIABLES]: rows.append([ var, self.pj[OBSERVATIONS][self.lw.item( idx).text()][INDEPENDENT_VARIABLES][var] ]) if self.excluded_behaviors_list.text(): s1, s2 = self.excluded_behaviors_list.text().split(": ") rows.extend([[""], [s1] + s2.split(", ")]) rows.extend([[""], [""], ["Time budget:"]]) # write header header = [] for col_idx in range(self.twTB.columnCount()): header.append(self.twTB.horizontalHeaderItem(col_idx).text()) rows.append(header) rows.append([""]) for row in range(self.twTB.rowCount()): values = [] for col_idx in range(self.twTB.columnCount()): values.append( intfloatstr(self.twTB.item(row, col_idx).text())) rows.append(values) max_row_length = max([len(r) for r in rows]) data = tablib.Dataset() data.title = "Time budget" for row in rows: data.append(complete(row, max_row_length)) if outputFormat in ["tsv", "csv", "html"]: with open(file_name, "wb") as f: f.write(str.encode(data.export(outputFormat))) return if outputFormat in ["ods", "xlsx", "xls"]: with open(file_name, "wb") as f: f.write(data.export(outputFormat)) return
def test_float(self): assert utilities.intfloatstr("1.458") == "1.458"
def export_events(parameters, obsId, observation, ethogram, file_name, output_format): """ export events Args: parameters (dict): subjects, behaviors obsId (str): observation id observation (dict): observation ethogram (dict): ethogram of project file_name (str): file name for exporting events output_format (str): output for exporting events Returns: bool: result: True if OK else False str: error message """ total_length = f"{project_functions.observation_total_length(observation):.3f}" eventsWithStatus = project_functions.events_start_stop( ethogram, observation[EVENTS]) # check max number of modifiers max_modifiers = 0 for event in eventsWithStatus: for c in pj_events_fields: if c == "modifier" and event[pj_obs_fields[c]]: max_modifiers = max(max_modifiers, len(event[pj_obs_fields[c]].split("|"))) # media file number mediaNb = 0 if observation["type"] == MEDIA: for player in observation[FILE]: mediaNb += len(observation[FILE][player]) rows = [] # observation id rows.append(["Observation id", obsId]) rows.append([""]) # media file name if observation["type"] in [MEDIA]: rows.append(["Media file(s)"]) elif observation["type"] in [LIVE]: rows.append(["Live observation"]) else: rows.append(["?"]) rows.append([""]) if observation[TYPE] in [MEDIA]: for player in sorted(list(observation[FILE].keys())): for media in observation[FILE][player]: rows.append([f"Player #{player}", media]) rows.append([""]) # date if "date" in observation: rows.append( ["Observation date", observation["date"].replace("T", " ")]) rows.append([""]) # description if "description" in observation: rows.append( ["Description", utilities.eol2space(observation["description"])]) rows.append([""]) # time offset if "time offset" in observation: rows.append(["Time offset (s)", observation["time offset"]]) rows.append([""]) # independent variables if INDEPENDENT_VARIABLES in observation: rows.extend([["independent variables"], ["variable", "value"]]) for variable in observation[INDEPENDENT_VARIABLES]: rows.append( [variable, observation[INDEPENDENT_VARIABLES][variable]]) rows.append([""]) # write table header col = 0 header = ["Time"] header.extend(["Media file path", "Total length", "FPS"]) header.extend(["Subject", "Behavior", "Behavioral category"]) behavioral_category = project_functions.behavior_category(ethogram) for x in range(1, max_modifiers + 1): header.append(f"Modifier {x}") header.extend(["Comment", "Status"]) rows.append(header) duration1 = [] # in seconds if observation["type"] in [MEDIA]: try: for mediaFile in observation[FILE][PLAYER1]: duration1.append(observation[MEDIA_INFO]["length"][mediaFile]) except KeyError: pass for event in eventsWithStatus: if (((event[SUBJECT_EVENT_FIELD] in parameters["selected subjects"]) or (event[SUBJECT_EVENT_FIELD] == "" and NO_FOCAL_SUBJECT in parameters["selected subjects"])) and (event[BEHAVIOR_EVENT_FIELD] in parameters["selected behaviors"])): fields = [] fields.append( utilities.intfloatstr(str(event[EVENT_TIME_FIELD_IDX]))) if observation["type"] in [MEDIA]: time_ = event[EVENT_TIME_FIELD_IDX] - observation[TIME_OFFSET] if time_ < 0: time_ = 0 if duration1: mediaFileIdx = [ idx1 for idx1, x in enumerate(duration1) if time_ >= sum(duration1[0:idx1]) ][-1] fields.append(observation[FILE][PLAYER1][mediaFileIdx]) fields.append(total_length) # FPS try: fields.append(observation[MEDIA_INFO]["fps"][ observation[FILE][PLAYER1][mediaFileIdx]]) # fps except KeyError: fields.append("NA") else: fields.append("NA") # media file fields.append("NA") # FPS if observation["type"] in [LIVE]: fields.append(LIVE) # media fields.append(total_length) # total length fields.append("NA") # FPS fields.append(event[EVENT_SUBJECT_FIELD_IDX]) fields.append(event[EVENT_BEHAVIOR_FIELD_IDX]) # behavioral category try: behav_category = behavioral_category[ event[EVENT_BEHAVIOR_FIELD_IDX]] except Exception: behav_category = "" fields.append(behav_category) # modifiers if max_modifiers: modifiers = event[EVENT_MODIFIER_FIELD_IDX].split("|") while len(modifiers) < max_modifiers: modifiers.append("") for m in modifiers: fields.append(m) # comment fields.append(event[EVENT_COMMENT_FIELD_IDX].replace( os.linesep, " ")) # status fields.append(event[-1]) rows.append(fields) maxLen = max([len(r) for r in rows]) data = tablib.Dataset() data.title = utilities.safe_xl_worksheet_title(obsId, output_format) ''' if output_format in ["xls", "xlsx"]: for forbidden_char in EXCEL_FORBIDDEN_CHARACTERS: data.title = data.title.replace(forbidden_char, " ") if output_format in ["xls"]: if len(data.title) > 31: data.title = data.title[0:31] ''' for row in rows: data.append(utilities.complete(row, maxLen)) r, msg = dataset_write(data, file_name, output_format) return r, msg
def test_str(self): assert utilities.intfloatstr("abc") == "abc"
def test_int(self): assert utilities.intfloatstr("8") == 8
def pbSave_clicked(self): """ save time budget analysis results in TSV, CSV, ODS, XLS format """ def complete(l: list, max_: int) -> list: """ complete list with empty string until len = max Args: l (list): list to complete max_ (int): length of the returned list Returns: list: completed list """ while len(l) < max_: l.append("") return l logging.debug("save time budget results to file") extended_file_formats = ["Tab Separated Values (*.tsv)", "Comma Separated Values (*.csv)", "Open Document Spreadsheet ODS (*.ods)", "Microsoft Excel Spreadsheet XLSX (*.xlsx)", "Legacy Microsoft Excel Spreadsheet XLS (*.xls)", "HTML (*.html)"] file_formats = ["tsv", "csv", "ods", "xlsx", "xls", "html"] filediag_func = QFileDialog().getSaveFileName file_name, filter_ = filediag_func(self, "Save Time budget analysis", "", ";;".join(extended_file_formats)) if not file_name: return outputFormat = file_formats[extended_file_formats.index(filter_)] if pathlib.Path(file_name).suffix != "." + outputFormat: file_name = str(pathlib.Path(file_name)) + "." + outputFormat # check if file with new extension already exists if pathlib.Path(file_name).is_file(): if dialog.MessageDialog(programName, "The file {} already exists.".format(file_name), [CANCEL, OVERWRITE]) == CANCEL: return rows = [] # observations list rows.append(["Observations:"]) for idx in range(self.lw.count()): rows.append([""]) rows.append([self.lw.item(idx).text()]) if INDEPENDENT_VARIABLES in self.pj[OBSERVATIONS][self.lw.item(idx).text()]: rows.append(["Independent variables:"]) for var in self.pj[OBSERVATIONS][self.lw.item(idx).text()][INDEPENDENT_VARIABLES]: rows.append([var, self.pj[OBSERVATIONS][self.lw.item(idx).text()][INDEPENDENT_VARIABLES][var]]) if self.excluded_behaviors_list.text(): s1, s2 = self.excluded_behaviors_list.text().split(": ") rows.extend([[""], [s1] + s2.split(", ")]) rows.extend([[""], [""], ["Time budget:"]]) # write header cols = [] for col in range(self.twTB.columnCount()): cols.append(self.twTB.horizontalHeaderItem(col).text()) rows.append(cols) rows.append([""]) for row in range(self.twTB.rowCount()): values = [] for col in range(self.twTB.columnCount()): values.append(intfloatstr(self.twTB.item(row, col).text())) rows.append(values) maxLen = max([len(r) for r in rows]) data = tablib.Dataset() data.title = "Time budget" for row in rows: data.append(complete(row, maxLen)) if outputFormat in ["tsv", "csv", "html"]: with open(file_name, "wb") as f: f.write(str.encode(data.export(outputFormat))) return if outputFormat in ["ods", "xlsx", "xls"]: with open(file_name, "wb") as f: f.write(data.export(outputFormat)) return
def pbSave_clicked(self): """ save time budget analysis results in TSV, CSV, ODS, XLS format """ def complete(l: list, max_: int) -> list: """ complete list with empty string until len = max Args: l (list): list to complete max_ (int): length of the returned list Returns: list: completed list """ while len(l) < max_: l.append("") return l logging.debug("save time budget results to file") extended_file_formats = [ "Tab Separated Values (*.tsv)", "Comma Separated Values (*.csv)", "Open Document Spreadsheet ODS (*.ods)", "Microsoft Excel Spreadsheet XLSX (*.xlsx)", "Legacy Microsoft Excel Spreadsheet XLS (*.xls)", "HTML (*.html)" ] file_formats = ["tsv", "csv", "ods", "xlsx", "xls", "html"] filediag_func = QFileDialog().getSaveFileName file_name, filter_ = filediag_func(self, "Save Time budget analysis", "", ";;".join(extended_file_formats)) if not file_name: return outputFormat = file_formats[extended_file_formats.index(filter_)] if pathlib.Path(file_name).suffix != "." + outputFormat: file_name = str(pathlib.Path(file_name)) + "." + outputFormat # check if file with new extension already exists if pathlib.Path(file_name).is_file(): if dialog.MessageDialog( programName, "The file {} already exists.".format(file_name), [CANCEL, OVERWRITE]) == CANCEL: return rows = [] # observations list rows.append(["Observations:"]) for idx in range(self.lw.count()): rows.append([""]) rows.append([self.lw.item(idx).text()]) if INDEPENDENT_VARIABLES in self.pj[OBSERVATIONS][self.lw.item( idx).text()]: rows.append(["Independent variables:"]) for var in self.pj[OBSERVATIONS][self.lw.item( idx).text()][INDEPENDENT_VARIABLES]: rows.append([ var, self.pj[OBSERVATIONS][self.lw.item(idx).text()] [INDEPENDENT_VARIABLES][var] ]) if self.excluded_behaviors_list.text(): s1, s2 = self.excluded_behaviors_list.text().split(": ") rows.extend([[""], [s1] + s2.split(", ")]) rows.extend([[""], [""], ["Time budget:"]]) # write header cols = [] for col in range(self.twTB.columnCount()): cols.append(self.twTB.horizontalHeaderItem(col).text()) rows.append(cols) rows.append([""]) for row in range(self.twTB.rowCount()): values = [] for col in range(self.twTB.columnCount()): values.append(intfloatstr(self.twTB.item(row, col).text())) rows.append(values) maxLen = max([len(r) for r in rows]) data = tablib.Dataset() data.title = "Time budget" for row in rows: data.append(complete(row, maxLen)) if outputFormat in ["tsv", "csv", "html"]: with open(file_name, "wb") as f: f.write(str.encode(data.export(outputFormat))) return if outputFormat in ["ods", "xlsx", "xls"]: with open(file_name, "wb") as f: f.write(data.export(outputFormat)) return
def export_events(parameters, obsId, observation, ethogram, file_name, output_format): """ export events Args: parameters (dict): subjects, behaviors obsId (str): observation id observation (dict): observation ethogram (dict): ethogram of project file_name (str): file name for exporting events output_format (str): output for exporting events Returns: bool: result: True if OK else False str: error message """ total_length = "{0:.3f}".format(project_functions.observation_total_length(observation)) eventsWithStatus = project_functions.events_start_stop(ethogram, observation[EVENTS]) # check max number of modifiers max_modifiers = 0 for event in eventsWithStatus: for c in pj_events_fields: if c == "modifier" and event[pj_obs_fields[c]]: max_modifiers = max(max_modifiers, len(event[pj_obs_fields[c]].split("|"))) # media file number mediaNb = 0 if observation["type"] == MEDIA: for player in observation[FILE]: mediaNb += len(observation[FILE][player]) rows = [] # observation id rows.append(["Observation id", obsId]) rows.append([""]) # media file name if observation["type"] in [MEDIA]: rows.append(["Media file(s)"]) elif observation["type"] in [LIVE]: rows.append(["Live observation"]) else: rows.append(["?"]) rows.append([""]) if observation[TYPE] in [MEDIA]: for player in sorted(list(observation[FILE].keys())): for media in observation[FILE][player]: rows.append(["Player #{0}".format(player), media]) rows.append([""]) # date if "date" in observation: rows.append(["Observation date", observation["date"].replace("T", " ")]) rows.append([""]) # description if "description" in observation: rows.append(["Description", utilities.eol2space(observation["description"])]) rows.append([""]) # time offset if "time offset" in observation: rows.append(["Time offset (s)", observation["time offset"]]) rows.append([""]) # independent variables if INDEPENDENT_VARIABLES in observation: rows.extend([["independent variables"], ["variable", "value"]]) for variable in observation[INDEPENDENT_VARIABLES]: rows.append([variable, observation[INDEPENDENT_VARIABLES][variable]]) rows.append([""]) # write table header col = 0 header = ["Time"] header.extend(["Media file path", "Total length", "FPS"]) header.extend(["Subject", "Behavior", "Behavioral category"]) behavioral_category = project_functions.behavior_category(ethogram) for x in range(1, max_modifiers + 1): header.append("Modifier {}".format(x)) header.extend(["Comment", "Status"]) rows.append(header) duration1 = [] # in seconds if observation["type"] in [MEDIA]: try: for mediaFile in observation[FILE][PLAYER1]: duration1.append(observation[MEDIA_INFO]["length"][mediaFile]) except KeyError: pass for event in eventsWithStatus: if (((event[SUBJECT_EVENT_FIELD] in parameters["selected subjects"]) or (event[SUBJECT_EVENT_FIELD] == "" and NO_FOCAL_SUBJECT in parameters["selected subjects"])) and (event[BEHAVIOR_EVENT_FIELD] in parameters["selected behaviors"])): fields = [] fields.append(utilities.intfloatstr(str(event[EVENT_TIME_FIELD_IDX]))) if observation["type"] in [MEDIA]: time_ = event[EVENT_TIME_FIELD_IDX] - observation[TIME_OFFSET] if time_ < 0: time_ = 0 if duration1: mediaFileIdx = [idx1 for idx1, x in enumerate(duration1) if time_ >= sum(duration1[0:idx1])][-1] fields.append(observation[FILE][PLAYER1][mediaFileIdx]) fields.append(total_length) # FPS try: fields.append(observation[MEDIA_INFO]["fps"][observation[FILE][PLAYER1][mediaFileIdx]]) # fps except KeyError: fields.append("NA") else: fields.append("NA") # media file fields.append("NA") # FPS if observation["type"] in [LIVE]: fields.append(LIVE) # media fields.append(total_length) # total length fields.append("NA") # FPS fields.append(event[EVENT_SUBJECT_FIELD_IDX]) fields.append(event[EVENT_BEHAVIOR_FIELD_IDX]) # behavioral category try: behav_category = behavioral_category[event[EVENT_BEHAVIOR_FIELD_IDX]] except Exception: behav_category = "" fields.append(behav_category) # modifiers if max_modifiers: modifiers = event[EVENT_MODIFIER_FIELD_IDX].split("|") while len(modifiers) < max_modifiers: modifiers.append("") for m in modifiers: fields.append(m) # comment fields.append(event[EVENT_COMMENT_FIELD_IDX].replace(os.linesep, " ")) # status fields.append(event[-1]) rows.append(fields) maxLen = max([len(r) for r in rows]) data = tablib.Dataset() data.title = obsId # check if worksheet name will be > 31 char if output_format in ["xls", "xlsx"]: for forbidden_char in EXCEL_FORBIDDEN_CHARACTERS: data.title = data.title.replace(forbidden_char, " ") if output_format in ["xls"]: if len(data.title) > 31: data.title = data.title[0:31] for row in rows: data.append(utilities.complete(row, maxLen)) r, msg = dataset_write(data, file_name, output_format) return r, msg
def pbSave_clicked(self): """ save time budget analysis results in TSV, CSV, ODS, XLS format """ def complete(l, max): """ complete list with empty string until len = max """ while len(l) < max: l.append("") return l logging.debug("save time budget results to file") formats_str = ("Tab Separated Values *.txt, *.tsv (*.txt *.tsv);;" "Comma Separated Values *.txt *.csv (*.txt *.csv);;" "Open Document Spreadsheet *.ods (*.ods);;" "Microsoft Excel Spreadsheet *.xlsx (*.xlsx);;" "HTML *.html (*.html);;" #"Pandas dataframe (*.df);;" "Legacy Microsoft Excel Spreadsheet *.xls (*.xls);;" "All files (*)") while True: if QT_VERSION_STR[0] == "4": fileName, filter_ = QFileDialog(self).getSaveFileNameAndFilter(self, "Save Time budget analysis", "", formats_str) else: fileName, filter_ = QFileDialog(self).getSaveFileName(self, "Save Time budget analysis", "", formats_str) if not fileName: return outputFormat = "" availableFormats = ("tsv", "csv", "ods", "xlsx)", "xls)", "html") for fileExtension in availableFormats: if fileExtension in filter_: outputFormat = fileExtension.replace(")", "") if not outputFormat: QMessageBox.warning(self, programName, "Choose a file format", QMessageBox.Ok | QMessageBox.Default, QMessageBox.NoButton) else: break if fileName: rows = [] # observations list rows.append(["Observations:"]) for idx in range(self.lw.count()): rows.append([""]) rows.append([self.lw.item(idx).text()]) if INDEPENDENT_VARIABLES in self.pj[OBSERVATIONS][self.lw.item(idx).text()]: rows.append(["Independent variables:"]) for var in self.pj[OBSERVATIONS][self.lw.item(idx).text()][INDEPENDENT_VARIABLES]: rows.append([var, self.pj[OBSERVATIONS][self.lw.item(idx).text()][INDEPENDENT_VARIABLES][var]]) rows.append([""]) rows.append([""]) rows.append(["Time budget:"]) # write header cols = [] for col in range(self.twTB.columnCount()): cols.append(self.twTB.horizontalHeaderItem(col).text()) rows.append(cols) rows.append([""]) for row in range(self.twTB.rowCount()): values = [] for col in range(self.twTB.columnCount()): values.append(intfloatstr(self.twTB.item(row,col).text())) rows.append(values) maxLen = max([len(r) for r in rows]) data = tablib.Dataset() data.title = "Time budget" for row in rows: data.append(complete(row, maxLen)) if outputFormat == "tsv": with open(fileName, "wb") as f: f.write(str.encode(data.tsv)) return if outputFormat == "csv": with open(fileName, "wb") as f: f.write(str.encode(data.csv)) return if outputFormat == "ods": with open(fileName, "wb") as f: f.write(data.ods) return if outputFormat == "xlsx": with open(fileName, "wb") as f: f.write(data.xlsx) return if outputFormat == "xls": with open(fileName, "wb") as f: f.write(data.xls) return if outputFormat == "html": with open(fileName, "wb") as f: f.write(str.encode(data.html)) return '''