[merge] saving got a progress bar, runs in thread

This commit is contained in:
Jan Grewe 2025-02-03 20:51:15 +01:00
parent 04ff142f1c
commit a1d0e39fd4
3 changed files with 44 additions and 6 deletions

View File

@ -220,7 +220,7 @@ class Merger(QRunnable):
@property @property
def result(self): def result(self):
return self._result return self._merged
# TEST code # TEST code

View File

@ -1,4 +1,6 @@
import pickle
import logging import logging
from PySide6.QtCore import QRunnable, Slot from PySide6.QtCore import QRunnable, Slot
from fixtracks.utils.signals import WriterSignals from fixtracks.utils.signals import WriterSignals
@ -17,3 +19,18 @@ class PickleWriter(QRunnable):
logging.info("Saving/pickling merged file to %s", self.file_path) logging.info("Saving/pickling merged file to %s", self.file_path)
self.data.save(self.file_path) self.data.save(self.file_path)
self.signals.finished.emit(True) 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)

View File

@ -1,11 +1,14 @@
import logging import logging
import pathlib import pathlib
from PySide6.QtCore import Qt, QThreadPool, Signal, Slot, QRect, QSize, QPoint 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 PySide6.QtGui import QImage, QPixmap, QColor, QPen, QPainter
from fixtracks.utils.reader import ImageReader, DataFrameReader from fixtracks.utils.reader import ImageReader, DataFrameReader
from fixtracks.utils.merger import Merger from fixtracks.utils.merger import Merger
from fixtracks.utils.writer import DataFrameWriter
class VideoPreview(QWidget): class VideoPreview(QWidget):
@ -77,7 +80,7 @@ class MergeDetections(QWidget):
self.left_preview = VideoPreview() self.left_preview = VideoPreview()
self.left_framespinner = QSpinBox() self.left_framespinner = QSpinBox()
self.left_framespinner.setMaximum(10000) self.left_framespinner.setMaximum(10000)
self.left_framespinner.setValue(100) self.left_framespinner.setValue(500)
self.right_datacombo = QComboBox() self.right_datacombo = QComboBox()
self.right_videocombo = QComboBox() self.right_videocombo = QComboBox()
@ -88,7 +91,7 @@ class MergeDetections(QWidget):
self.right_preview = VideoPreview(left=False) self.right_preview = VideoPreview(left=False)
self.right_framespinner = QSpinBox() self.right_framespinner = QSpinBox()
self.right_framespinner.setMaximum(10000) self.right_framespinner.setMaximum(10000)
self.right_framespinner.setValue(100) self.right_framespinner.setValue(500)
self._mergePreviewBtn = QPushButton("Preview") self._mergePreviewBtn = QPushButton("Preview")
self._mergePreviewBtn.clicked.connect(self.on_mergePreview) self._mergePreviewBtn.clicked.connect(self.on_mergePreview)
@ -105,6 +108,11 @@ class MergeDetections(QWidget):
self._backBtn = QPushButton("Back") self._backBtn = QPushButton("Back")
self._backBtn.clicked.connect(self.on_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 = QGridLayout()
grid.addWidget(self.left_preview, 0, 0) grid.addWidget(self.left_preview, 0, 0)
grid.addWidget(self.right_preview, 0, 1) grid.addWidget(self.right_preview, 0, 1)
@ -115,6 +123,8 @@ class MergeDetections(QWidget):
btnBox.setAlignment(Qt.AlignmentFlag.AlignLeft) btnBox.setAlignment(Qt.AlignmentFlag.AlignLeft)
btnBox.addWidget(self._backBtn) btnBox.addWidget(self._backBtn)
btnBox.addItem(QSpacerItem(100, 10, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)) 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._mergeBtn)
btnBox.addWidget(self._saveBtn) btnBox.addWidget(self._saveBtn)
btnBox.addWidget(self._mergePreviewBtn) btnBox.addWidget(self._mergePreviewBtn)
@ -335,7 +345,8 @@ class MergeDetections(QWidget):
return img return img
def on_save(self): 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: if self._merger is not None:
file_dialog = QFileDialog(self) file_dialog = QFileDialog(self)
file_dialog.setAcceptMode(QFileDialog.AcceptMode.AcceptSave) file_dialog.setAcceptMode(QFileDialog.AcceptMode.AcceptSave)
@ -344,7 +355,12 @@ class MergeDetections(QWidget):
file_path = file_dialog.selectedFiles()[0] file_path = file_dialog.selectedFiles()[0]
if not file_path.endswith(".pkl"): if not file_path.endswith(".pkl"):
file_path += ".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) p = pathlib.Path(file_path)
img = self.merge_images() img = self.merge_images()
img_name = p.with_suffix(".png") img_name = p.with_suffix(".png")
@ -352,6 +368,11 @@ class MergeDetections(QWidget):
else: else:
logging.debug("Saving failed! Merger is None!") 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): def on_back(self):
logging.debug("Back button pressed!") logging.debug("Back button pressed!")
self._merger = None self._merger = None