import threading import time from abc import ABC, abstractmethod from tkinter import Tk from tkinter.ttk import Notebook from tkinter import Frame class ThreadedTab(ABC, Frame): def __init__(self, root: Notebook | Tk, stop_event: threading.Event, refresh_rate=1, **kwargs): super().__init__(root, **kwargs) self.stop_event = stop_event self.refresh_rate = refresh_rate self._thread = threading.Thread(target=self.__loop) self.build() self._thread.start() def __loop(self): while not self.stop_event.is_set(): self.task() start = time.time() while time.time() - start < self.refresh_rate: if self.stop_event.is_set(): break time.sleep(0.2) @abstractmethod def build(self): pass @abstractmethod def task(self, *args): raise NotImplementedError("Method not implemented")