Source code for xraylabtool.gui.workers
"""Threaded workers for GUI calculations."""
from __future__ import annotations
from collections.abc import Callable
import traceback
from typing import Any
from PySide6.QtCore import QObject, QRunnable, Signal
[docs]
class WorkerSignals(QObject):
finished = Signal(object)
error = Signal(str)
progress = Signal(int)
[docs]
class CalculationWorker(QRunnable):
[docs]
def __init__(self, fn: Callable[..., Any], *args: Any, **kwargs: Any) -> None:
super().__init__()
self.fn = fn
self.args = args
self.kwargs = kwargs
self.signals = WorkerSignals()
[docs]
def run(self) -> None:
try:
# Inject progress callback if the target function accepts it
if "progress_cb" in self.fn.__code__.co_varnames:
self.kwargs.setdefault("progress_cb", self.signals.progress.emit)
result = self.fn(*self.args, **self.kwargs)
except Exception as exc:
tb = traceback.format_exc()
self.signals.error.emit(f"{exc}\n{tb}")
return
self.signals.finished.emit(result)