From a1d0e39fd440de3879a5d9ee2498b817d8480fb2 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Mon, 3 Feb 2025 20:51:15 +0100 Subject: [PATCH] [merge] saving got a progress bar, runs in thread --- fixtracks/utils/merger.py | 2 +- fixtracks/utils/writer.py | 17 ++++++++++++++++ fixtracks/widgets/detectionmerge.py | 31 ++++++++++++++++++++++++----- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/fixtracks/utils/merger.py b/fixtracks/utils/merger.py index a8f55dc..c66fe47 100644 --- a/fixtracks/utils/merger.py +++ b/fixtracks/utils/merger.py @@ -220,7 +220,7 @@ class Merger(QRunnable): @property def result(self): - return self._result + return self._merged # TEST code diff --git a/fixtracks/utils/writer.py b/fixtracks/utils/writer.py index 0c6ce8b..16d3c6c 100644 --- a/fixtracks/utils/writer.py +++ b/fixtracks/utils/writer.py @@ -1,4 +1,6 @@ +import pickle import logging + from PySide6.QtCore import QRunnable, Slot from fixtracks.utils.signals import WriterSignals @@ -17,3 +19,18 @@ class PickleWriter(QRunnable): logging.info("Saving/pickling merged file to %s", self.file_path) self.data.save(self.file_path) self.signals.finished.emit(True) + +class DataFrameWriter(QRunnable): + signals = WriterSignals() + + def __init__(self, data, file_path): + super().__init__(self) + self.data = data + self.file_path = file_path + + @Slot() + def run(self): + logging.info("Saving/pickling DataFrame to %s" % self.file_path) + with open(self.file_path, 'wb') as f: + pickle.dump(self.data, f) + self.signals.finished.emit(True) \ No newline at end of file diff --git a/fixtracks/widgets/detectionmerge.py b/fixtracks/widgets/detectionmerge.py index 056ed09..0a47705 100644 --- a/fixtracks/widgets/detectionmerge.py +++ b/fixtracks/widgets/detectionmerge.py @@ -1,11 +1,14 @@ import logging import pathlib from PySide6.QtCore import Qt, QThreadPool, Signal, Slot, QRect, QSize, QPoint -from PySide6.QtWidgets import QWidget, QGridLayout, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QComboBox, QSizePolicy, QSpinBox, QGraphicsView, QGraphicsScene, QGraphicsLineItem, QSpacerItem, QProgressDialog, QFileDialog +from PySide6.QtWidgets import QWidget, QGridLayout, QVBoxLayout, QHBoxLayout, QLabel, QProgressBar +from PySide6.QtWidgets import QPushButton, QComboBox, QSizePolicy, QSpinBox, QGraphicsView +from PySide6.QtWidgets import QGraphicsScene, QGraphicsLineItem, QSpacerItem, QProgressDialog, QFileDialog from PySide6.QtGui import QImage, QPixmap, QColor, QPen, QPainter from fixtracks.utils.reader import ImageReader, DataFrameReader from fixtracks.utils.merger import Merger +from fixtracks.utils.writer import DataFrameWriter class VideoPreview(QWidget): @@ -77,7 +80,7 @@ class MergeDetections(QWidget): self.left_preview = VideoPreview() self.left_framespinner = QSpinBox() self.left_framespinner.setMaximum(10000) - self.left_framespinner.setValue(100) + self.left_framespinner.setValue(500) self.right_datacombo = QComboBox() self.right_videocombo = QComboBox() @@ -88,7 +91,7 @@ class MergeDetections(QWidget): self.right_preview = VideoPreview(left=False) self.right_framespinner = QSpinBox() self.right_framespinner.setMaximum(10000) - self.right_framespinner.setValue(100) + self.right_framespinner.setValue(500) self._mergePreviewBtn = QPushButton("Preview") self._mergePreviewBtn.clicked.connect(self.on_mergePreview) @@ -105,6 +108,11 @@ class MergeDetections(QWidget): self._backBtn = QPushButton("Back") self._backBtn.clicked.connect(self.on_back) + self._progress_bar = QProgressBar(self) + self._progress_bar.setMaximumHeight(20) + self._progress_bar.setValue(0) + self._tasklabel = QLabel() + grid = QGridLayout() grid.addWidget(self.left_preview, 0, 0) grid.addWidget(self.right_preview, 0, 1) @@ -115,6 +123,8 @@ class MergeDetections(QWidget): btnBox.setAlignment(Qt.AlignmentFlag.AlignLeft) btnBox.addWidget(self._backBtn) btnBox.addItem(QSpacerItem(100, 10, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)) + btnBox.addWidget(self._tasklabel) + btnBox.addWidget(self._progress_bar) btnBox.addWidget(self._mergeBtn) btnBox.addWidget(self._saveBtn) btnBox.addWidget(self._mergePreviewBtn) @@ -335,7 +345,8 @@ class MergeDetections(QWidget): return img def on_save(self): - logging.debug("Save merge results") + logging.debug("MergeDetections: Saving merge results") + self._tasklabel.setText("Saving results to file...") if self._merger is not None: file_dialog = QFileDialog(self) file_dialog.setAcceptMode(QFileDialog.AcceptMode.AcceptSave) @@ -344,7 +355,12 @@ class MergeDetections(QWidget): file_path = file_dialog.selectedFiles()[0] if not file_path.endswith(".pkl"): file_path += ".pkl" - self._merger.save(file_path) + + self._progress_bar.setRange(0,0) + save_task = DataFrameWriter(self._merger.result, file_path) + save_task.signals.finished.connect(self.on_dataSaved) + self.threadpool.start(save_task) + p = pathlib.Path(file_path) img = self.merge_images() img_name = p.with_suffix(".png") @@ -352,6 +368,11 @@ class MergeDetections(QWidget): else: logging.debug("Saving failed! Merger is None!") + def on_dataSaved(self): + self._tasklabel.setText("") + self._progress_bar.setRange(0, 100) + self._progress_bar.setValue(0) + def on_back(self): logging.debug("Back button pressed!") self._merger = None