import logging import threading from typing import Any, Callable class BackgroundTask: def __init__(self, master: Any, task: Callable, callback: Callable = None, args=()): self.master = master self.args = args self.task = task self.callback = callback self.thread = None def start(self): logging.info("starting task") self.thread = threading.Thread(target=self.run, daemon=True) self.thread.start() def run(self): result = self.task(*self.args) logging.info("task completed") if self.callback: if result is None: args = () elif isinstance(result, (list, tuple)): args = result else: args = (result,) logging.info("calling callback: %s", args) self.master.after(0, self.callback, *args)