From 5cf87a5e7b071c935cbdc92da6c2b550d020f83d Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 10:41:38 +0100 Subject: [PATCH 1/8] Mainwindow: Fix table export. --- View/mainwindow.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/View/mainwindow.py b/View/mainwindow.py index 8244de2..0ef2704 100644 --- a/View/mainwindow.py +++ b/View/mainwindow.py @@ -39,6 +39,7 @@ from View.about_window import AboutWindow import settings as stg import numpy as np +import pandas as pd from subprocess import Popen import time @@ -363,15 +364,19 @@ class Ui_MainWindow(object): stg.BS_raw_data_reshape[i][:, freq_ind])) )) - exec("DataFrame_acoustic_" + str(i) + "= pd.DataFrame(None)") - exec("DataFrame_acoustic_" + str(i) + "= pd.DataFrame(data=table_data.transpose(), columns=header_list)") + DataFrame_acoustic = pd.DataFrame(None) + DataFrame_acoustic = pd.DataFrame( + data=table_data.transpose(), columns=header_list + ) - exec("DataFrame_acoustic_" + str(i) + ".to_csv(" + - "path_or_buf=" + - "'" + name + "/" + "Table_" + - str(stg.filename_BS_raw_data[i][:-4]) + ".csv'" + ", " + - "sep=" + "',' " + ", " + - "header=DataFrame_acoustic_" + str(i) + ".columns" + ")") + DataFrame_acoustic.to_csv( + path_or_buf=os.path.join( + name, + f"Table_{str(stg.filename_BS_raw_data[i][:-4])}.csv" + ), + header=DataFrame_acoustic.columns, + sep=',', + ) t1 = time.time() - t0 print("time duration export BS ", t1) From 11ced0a263ca657902256000c9236adc90046d21 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 10:44:49 +0100 Subject: [PATCH 2/8] Mainwindow: Minor change. --- View/mainwindow.py | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/View/mainwindow.py b/View/mainwindow.py index 0ef2704..b1a87a2 100644 --- a/View/mainwindow.py +++ b/View/mainwindow.py @@ -326,23 +326,21 @@ class Ui_MainWindow(object): self.open_doc_file('Tutorial_AQUAscat_software.pdf') def export_table_of_acoustic_BS_values_to_excel_or_libreOfficeCalc_file(self): - if len(stg.BS_raw_data_reshape) != 0: - - # --- Open file dialog to select the directory --- - - name = QtWidgets.QFileDialog.getExistingDirectory(caption="Select Directory - Acoustic BS raw data Table") + name = QtWidgets.QFileDialog.getExistingDirectory( + caption="Select Directory - Acoustic BS raw data Table" + ) print("name table to save ", name) - # --- Save the raw acoustic backscatter data from a Dataframe to csv file --- + # --- Save the raw acoustic backscatter data from a + # --- Dataframe to csv file --- t0 = time.time() - print("len(stg.BS_raw_data_reshape) ", len(stg.BS_raw_data_reshape)) + print("len(stg.BS_raw_data_reshape) ", + len(stg.BS_raw_data_reshape)) if name: - for i in range(len(stg.BS_raw_data_reshape)): - header_list = [] header_list.clear() table_data = np.array([[]]) @@ -352,17 +350,28 @@ class Ui_MainWindow(object): header_list.append("BS - " + freq_value) if freq_ind == 0: - table_data = np.vstack((np.vstack((stg.time_reshape[i][:, freq_ind], - stg.depth_reshape[i][:, freq_ind])), - stg.BS_raw_data_reshape[i][:, freq_ind])) + table_data = np.vstack( + ( + np.vstack( + (stg.time_reshape[i][:, freq_ind], + stg.depth_reshape[i][:, freq_ind])), + stg.BS_raw_data_reshape[i][:, freq_ind] + ) + ) else: - table_data = np.vstack((table_data, - np.vstack((np.vstack( - (stg.time_reshape[i][:, freq_ind], - stg.depth_reshape[i][:, freq_ind])), - stg.BS_raw_data_reshape[i][:, freq_ind])) - )) + table_data = np.vstack( + ( + table_data, + np.vstack(( + np.vstack(( + stg.time_reshape[i][:, freq_ind], + stg.depth_reshape[i][:, freq_ind] + )), + stg.BS_raw_data_reshape[i][:, freq_ind] + )) + ) + ) DataFrame_acoustic = pd.DataFrame(None) DataFrame_acoustic = pd.DataFrame( From 496937bde2818b4b7e6db46a0535cb5225b4bfcd Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 16:26:50 +0100 Subject: [PATCH 3/8] Acoustic data: Disable unused groupbox gps. --- View/acoustic_data_tab.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index f5afa08..922563d 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -294,6 +294,8 @@ class AcousticDataTab(QWidget): self.groupbox_gps = QGroupBox() self.groupbox_gps.setTitle("Convert recording time to distance from bank") self.horizontal_gps_input_data = QHBoxLayout(self.groupbox_gps) + self.groupbox_gps.setEnabled(False) + self.verticalLayout_groupbox_display_option.addWidget(self.groupbox_gps) From 4c024cbb4203ed7aee978f6cdc8b43405d1d2560 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 16:35:32 +0100 Subject: [PATCH 4/8] Acoustic data: Disable unused distance from bank (#39). --- View/acoustic_data_tab.py | 45 +++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index 922563d..fa33cd6 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -447,34 +447,61 @@ class AcousticDataTab(QWidget): # --------------------------------- self.label_distance_from_bank = QLabel("Distance from bank") - self.gridLayout_groupbox_display_option_limits.addWidget(self.label_distance_from_bank, 3, 0, 1, 1, Qt.AlignRight) + self.gridLayout_groupbox_display_option_limits.addWidget( + self.label_distance_from_bank, + 3, 0, 1, 1, Qt.AlignRight + ) + self.label_distance_from_bank.setEnabled(False) self.label_distance_from_bank_min = QLabel() self.label_distance_from_bank_min.setText("0.00") - self.gridLayout_groupbox_display_option_limits.addWidget(self.label_distance_from_bank_min, 3, 1, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_display_option_limits.addWidget( + self.label_distance_from_bank_min, + 3, 1, 1, 1, Qt.AlignCenter + ) + self.label_distance_from_bank_min.setEnabled(False) self.lineEdit_distance_from_bank_min_limits = QLineEdit() self.lineEdit_distance_from_bank_min_limits.setText("0.00") self.lineEdit_distance_from_bank_min_limits.setMaximumWidth(80) - self.gridLayout_groupbox_display_option_limits.addWidget(self.lineEdit_distance_from_bank_min_limits, 3, 2, 1, 1, - Qt.AlignCenter) + self.gridLayout_groupbox_display_option_limits.addWidget( + self.lineEdit_distance_from_bank_min_limits, + 3, 2, 1, 1, Qt.AlignCenter + ) + self.lineEdit_distance_from_bank_min_limits.setEnabled(False) self.lineEdit_distance_from_bank_max_limits = QLineEdit() self.lineEdit_distance_from_bank_max_limits.setText("0.00") self.lineEdit_distance_from_bank_max_limits.setMaximumWidth(80) - self.gridLayout_groupbox_display_option_limits.addWidget(self.lineEdit_distance_from_bank_max_limits, 3, 3, 1, 1, - Qt.AlignCenter) + self.gridLayout_groupbox_display_option_limits.addWidget( + self.lineEdit_distance_from_bank_max_limits, + 3, 3, 1, 1, Qt.AlignCenter + ) + self.lineEdit_distance_from_bank_max_limits.setEnabled(False) self.label_distance_from_bank_max = QLabel() self.label_distance_from_bank_max.setText("0.00") - self.gridLayout_groupbox_display_option_limits.addWidget(self.label_distance_from_bank_max, 3, 4, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_display_option_limits.addWidget( + self.label_distance_from_bank_max, + 3, 4, 1, 1, Qt.AlignCenter + ) + self.label_distance_from_bank_max.setEnabled(False) self.label_distance_from_bank_unit_meter = QLabel("meters") - self.gridLayout_groupbox_display_option_limits.addWidget(self.label_distance_from_bank_unit_meter, 3, 5, 1, 1, Qt.AlignCenter) + self.gridLayout_groupbox_display_option_limits.addWidget( + self.label_distance_from_bank_unit_meter, + 3, 5, 1, 1, Qt.AlignCenter + ) + self.label_distance_from_bank_unit_meter.setEnabled(False) self.pushbutton_apply_distance_from_bank_limits = QPushButton() self.pushbutton_apply_distance_from_bank_limits.setIcon(self.icon_apply_limits) - self.gridLayout_groupbox_display_option_limits.addWidget(self.pushbutton_apply_distance_from_bank_limits, 3, 6, 1, 1) + self.gridLayout_groupbox_display_option_limits.addWidget( + self.pushbutton_apply_distance_from_bank_limits, + 3, 6, 1, 1 + ) + self.pushbutton_apply_distance_from_bank_limits.setEnabled(False) + # --------------------------------------- From f0150443e347cf684036d898b6bd3c7d8a648f63 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 17:14:00 +0100 Subject: [PATCH 5/8] Acoustic data: Clear 'clear_files_from_ListWidget' method. --- View/acoustic_data_tab.py | 46 +++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index fa33cd6..4fb8a23 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -1518,27 +1518,14 @@ class AcousticDataTab(QWidget): self.slider.setMaximum(10) def clear_files_from_ListWidget(self): + self.fileListWidget.blockSignals(True) - list_to_clear = [ - "stg.acoustic_data", "stg.date", "stg.hour", - "stg.freq", "stg.freq_text", - "stg.nb_profiles", "stg.nb_profiles_per_sec", - "stg.nb_cells", "stg.cell_size", - "stg.pulse_length", "stg.nb_pings_per_sec", - "stg.nb_pings_averaged_per_profile", - "stg.kt_read", "stg.kt_corrected", "stg.gain_rx", "stg.gain_tx", - "stg.filename_BS_raw_data", "stg.path_BS_raw_data", - "stg.BS_raw_data", "stg.time", "stg.depth", - "stg.BS_raw_data_reshape", "stg.time_reshape", "stg.depth_reshape", - "stg.rmin", "stg.rmax", "stg.tmin", "stg.tmax", - "stg.time_cross_section", "stg.depth_cross_section", - "stg.BS_cross_section", "stg.BS_stream_bed" - ] + self.clear_files_data() + self.clear_files_from_ListWidget_reset() - for k in list_to_clear: - if isinstance(eval(k), list): - exec(k + ".clear()") + self.fileListWidget.blockSignals(False) + def clear_files_from_ListWidget_reset(self): self.fileListWidget.clear() # self.fileListWidget.takeItem(0) @@ -1615,6 +1602,27 @@ class AcousticDataTab(QWidget): self.slider.setValue(0) self.slider.setMaximum(10) + def clear_files_data(self): + list_to_clear = [ + stg.acoustic_data, stg.date, stg.hour, + stg.freq, stg.freq_text, + stg.nb_profiles, stg.nb_profiles_per_sec, + stg.nb_cells, stg.cell_size, + stg.pulse_length, stg.nb_pings_per_sec, + stg.nb_pings_averaged_per_profile, + stg.kt_read, stg.kt_corrected, stg.gain_rx, stg.gain_tx, + stg.filename_BS_raw_data, stg.path_BS_raw_data, + stg.BS_raw_data, stg.time, stg.depth, + stg.BS_raw_data_reshape, stg.time_reshape, stg.depth_reshape, + stg.rmin, stg.rmax, stg.tmin, stg.tmax, + stg.time_cross_section, stg.depth_cross_section, + stg.BS_cross_section, stg.BS_stream_bed + ] + + for k in list_to_clear: + if isinstance(k, list): + k.clear() + def load_BS_acoustic_raw_data(self): if self.fileListWidget.count() == 0: for p, f in zip(stg.path_BS_raw_data, @@ -2001,7 +2009,7 @@ class AcousticDataTab(QWidget): 14, 1, 1, 1, Qt.AlignLeft ) - if self.checkbox_kt.isChecked(): + if self.checkbox_kt.isChecked() and len(stg.kt_corrected) > freq_id: if self.combobox_frequency_information.count() > 0: self.lineEdit_kt.setText( str("%.4f" % stg.kt_corrected[freq_id]) From b9ca307c593243de86982a754234caa1fcd380ba Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 17:18:02 +0100 Subject: [PATCH 6/8] Acoustic data: Remove useless 'eval' or 'exec'. --- View/acoustic_data_tab.py | 45 +++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index 4fb8a23..db66d23 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -1411,40 +1411,43 @@ class AcousticDataTab(QWidget): # --- Clear variables --- list_to_pop1 = [ - "stg.acoustic_data", "stg.date", "stg.hour", - "stg.freq", "stg.freq_text", - "stg.nb_profiles", "stg.nb_profiles_per_sec", - "stg.nb_cells", "stg.cell_size", - "stg.pulse_length", "stg.nb_pings_per_sec", - "stg.nb_pings_averaged_per_profile", - "stg.kt_read", "stg.kt_corrected", "stg.gain_rx", "stg.gain_tx", - "stg.filename_BS_raw_data", "stg.path_BS_raw_data", - "stg.BS_raw_data", "stg.time", "stg.depth", - "stg.BS_raw_data_reshape", "stg.time_reshape", "stg.depth_reshape" + stg.acoustic_data, stg.date, stg.hour, + stg.freq, stg.freq_text, + stg.nb_profiles, stg.nb_profiles_per_sec, + stg.nb_cells, stg.cell_size, + stg.pulse_length, stg.nb_pings_per_sec, + stg.nb_pings_averaged_per_profile, + stg.kt_read, stg.kt_corrected, stg.gain_rx, stg.gain_tx, + stg.filename_BS_raw_data, stg.path_BS_raw_data, + stg.BS_raw_data, stg.time, stg.depth, + stg.BS_raw_data_reshape, stg.time_reshape, stg.depth_reshape ] for p in list_to_pop1: - if isinstance(eval(p), list): - exec(p + ".pop(current_row)") + if isinstance(p, list): + p.pop(current_row) if stg.BS_cross_section: - - list_to_pop2 = ["stg.rmin", "stg.rmax", "stg.tmin", "stg.tmax", - "stg.time_cross_section", "stg.depth_cross_section", "stg.BS_cross_section"] + list_to_pop2 = [ + stg.rmin, stg.rmax, stg.tmin, stg.tmax, + stg.time_cross_section, stg.depth_cross_section, + stg.BS_cross_section + ] for k in list_to_pop2: - exec(k + ".pop(current_row)") + k.pop(current_row) if stg.BS_stream_bed: - - list_to_pop3 = ["stg.BS_stream_bed", "stg.depth_bottom", - "stg.val_bottom", "stg.ind_bottom", "stg.freq_bottom_detection"] + list_to_pop3 = [ + stg.BS_stream_bed, stg.depth_bottom, + stg.val_bottom, stg.ind_bottom, + stg.freq_bottom_detection + ] for s in list_to_pop3: - exec(s + ".pop(current_row)") + s.pop(current_row) if self.fileListWidget.count() == 0: - # --- Clear measurements information --- self.label_date_acoustic_file.clear() self.label_date_acoustic_file.setText("Date: ") From b9669d9cbf52d96f45f70ff5bb89e0eeb7583948 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 17:25:19 +0100 Subject: [PATCH 7/8] Acoustic data: Refactorise 'remove_file_from_ListWidget' method. --- View/acoustic_data_tab.py | 156 +++++++++++--------------------------- 1 file changed, 45 insertions(+), 111 deletions(-) diff --git a/View/acoustic_data_tab.py b/View/acoustic_data_tab.py index db66d23..a0573f8 100644 --- a/View/acoustic_data_tab.py +++ b/View/acoustic_data_tab.py @@ -1388,7 +1388,6 @@ class AcousticDataTab(QWidget): self.fileListWidget.blockSignals(False) def rename_file_in_ListWidget(self, event): - if event == QEvent.MouseButtonPress: print("c'est bon") if event.button == Qt.RightButton: @@ -1401,124 +1400,59 @@ class AcousticDataTab(QWidget): menu.addAction('Rename') def remove_file_from_ListWidget(self): - if self.fileListWidget.count() > 0: + if self.fileListWidget.count() <= 0: + return - # --- Clear files included in list Widget --- - current_row = self.fileListWidget.currentRow() - if current_row >= 0: - current_item = self.fileListWidget.takeItem(current_row) - del current_item + self.fileListWidget.blockSignals(True) - # --- Clear variables --- - list_to_pop1 = [ - stg.acoustic_data, stg.date, stg.hour, - stg.freq, stg.freq_text, - stg.nb_profiles, stg.nb_profiles_per_sec, - stg.nb_cells, stg.cell_size, - stg.pulse_length, stg.nb_pings_per_sec, - stg.nb_pings_averaged_per_profile, - stg.kt_read, stg.kt_corrected, stg.gain_rx, stg.gain_tx, - stg.filename_BS_raw_data, stg.path_BS_raw_data, - stg.BS_raw_data, stg.time, stg.depth, - stg.BS_raw_data_reshape, stg.time_reshape, stg.depth_reshape + # --- Clear files included in list Widget --- + current_row = self.fileListWidget.currentRow() + if current_row >= 0: + current_item = self.fileListWidget.takeItem(current_row) + del current_item + + # --- Clear variables --- + list_to_pop1 = [ + stg.acoustic_data, stg.date, stg.hour, + stg.freq, stg.freq_text, + stg.nb_profiles, stg.nb_profiles_per_sec, + stg.nb_cells, stg.cell_size, + stg.pulse_length, stg.nb_pings_per_sec, + stg.nb_pings_averaged_per_profile, + stg.kt_read, stg.kt_corrected, stg.gain_rx, stg.gain_tx, + stg.filename_BS_raw_data, stg.path_BS_raw_data, + stg.BS_raw_data, stg.time, stg.depth, + stg.BS_raw_data_reshape, stg.time_reshape, stg.depth_reshape + ] + + for p in list_to_pop1: + if isinstance(p, list): + p.pop(current_row) + + if stg.BS_cross_section: + list_to_pop2 = [ + stg.rmin, stg.rmax, stg.tmin, stg.tmax, + stg.time_cross_section, stg.depth_cross_section, + stg.BS_cross_section ] - for p in list_to_pop1: - if isinstance(p, list): - p.pop(current_row) + for k in list_to_pop2: + k.pop(current_row) - if stg.BS_cross_section: - list_to_pop2 = [ - stg.rmin, stg.rmax, stg.tmin, stg.tmax, - stg.time_cross_section, stg.depth_cross_section, - stg.BS_cross_section - ] + if stg.BS_stream_bed: + list_to_pop3 = [ + stg.BS_stream_bed, stg.depth_bottom, + stg.val_bottom, stg.ind_bottom, + stg.freq_bottom_detection + ] - for k in list_to_pop2: - k.pop(current_row) + for s in list_to_pop3: + s.pop(current_row) - if stg.BS_stream_bed: - list_to_pop3 = [ - stg.BS_stream_bed, stg.depth_bottom, - stg.val_bottom, stg.ind_bottom, - stg.freq_bottom_detection - ] + if self.fileListWidget.count() == 0: + self.clear_files_from_ListWidget_reset() - for s in list_to_pop3: - s.pop(current_row) - - if self.fileListWidget.count() == 0: - # --- Clear measurements information --- - self.label_date_acoustic_file.clear() - self.label_date_acoustic_file.setText("Date: ") - self.label_hour_acoustic_file.clear() - self.label_hour_acoustic_file.setText("Hour: ") - self.lineEdit_sound_attenuation.setText("0.00") - self.combobox_frequency_information.clear() - self.label_profiles_value.clear() - self.label_profiles_per_sec_value.clear() - self.label_cells_value.clear() - self.label_cell_size_value.clear() - self.label_pulse_length_value.clear() - self.label_pings_per_sec_value.clear() - self.label_pings_per_profile_value.clear() - self.lineEdit_kt.setText("0.00") - self.lineEdit_rx.setText("0.00") - self.lineEdit_tx.setText("0.00") - - # --- Clear display options --- - - self.label_time_min.setText("0.00") - self.lineEdit_time_min_limits.setText("0.00") - self.lineEdit_time_max_limits.setText("0.00") - self.label_time_max.setText("0.00") - - self.label_depth_min.setText("0.00") - self.lineEdit_depth_min_limits.setText("0.00") - self.lineEdit_depth_max_limits.setText("0.00") - self.label_depth_max.setText("0.00") - - self.label_distance_from_bank_min.setText("0.00") - self.lineEdit_distance_from_bank_min_limits.setText("0.00") - self.lineEdit_distance_from_bank_max_limits.setText("0.00") - self.label_distance_from_bank_max.setText("0.00") - - self.combobox_frequency_bathymetry.clear() - self.lineEdit_depth_min_bathy.setText("0.00") - self.lineEdit_depth_max_bathy.setText("0.00") - self.lineEdit_next_cell_bathy.setText("0.00") - - # --- Clear table of values --- - self.tableView.reset() - data = pd.DataFrame(np.zeros((10, 10))) - self.tableModel = TableModel(data) - self.tableView.setModel(self.tableModel) - - # --- Clear figure : 2D plot of the acoustic recording --- - self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.removeWidget(self.scroll_BS) - self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.removeWidget(self.toolbar_BS) - - self.canvas_BS = FigureCanvas() - self.toolbar_BS = NavigationToolBar(self.canvas_BS, self) - self.scroll_BS.setWidget(self.canvas_BS) - - self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.addWidget(self.toolbar_BS) - self.verticalLayout_groupbox_transect_2Dplot_raw_BS_data.addWidget(self.scroll_BS) - - # --- Clear figure : profile --- - self.combobox_frequency_profile.clear() - - self.verticalLayout_groupbox_plot_profile.removeWidget(self.canvas_plot_profile) - self.verticalLayout_groupbox_plot_profile.removeWidget(self.toolbar_profile) - - self.canvas_plot_profile = FigureCanvas() - self.toolbar_profile = NavigationToolBar(self.canvas_plot_profile, self) - - self.verticalLayout_groupbox_plot_profile.addWidget(self.toolbar_profile) - self.verticalLayout_groupbox_plot_profile.addWidget(self.canvas_plot_profile) - - self.slider.setValue(0) - self.slider.setMaximum(10) + self.fileListWidget.blockSignals(False) def clear_files_from_ListWidget(self): self.fileListWidget.blockSignals(True) From 752697db8659b4bcabf797a9354fee9c1618c2d6 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 17 Mar 2025 17:26:50 +0100 Subject: [PATCH 8/8] gitignore: Add '.exe' files. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 5e1a067..d890898 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ TAGS Error_file.txt +# Windows executable file +*.exe + # Created by https://www.toptal.com/developers/gitignore/api/python # Edit at https://www.toptal.com/developers/gitignore?templates=python