def start(self, body, interval=0, iterations=0, timeout=0):
        self._active = True
        body = body or self.body

        def internal(counter, overrun=False, schedule=QtCore.QTimer.singleShot):
            if not self._active:
                self.loop_done.emit(True)
                return

            st = time.time()
            self.iteration.emit(counter, iterations, overrun)
            body(counter, iterations, overrun)

            if iterations and counter + 1 == iterations:
                self._active = False
                self.loop_done.emit(False)
                return
            elif not self._active:
                self.loop_done.emit(True)
                return

            sleep = interval - (time.time() - st)
            schedule(sleep * 1000 if sleep > 0 else 0,
                     lambda: self._internal_func(counter + 1, sleep < 0))

        self._internal_func = internal
        if timeout:
            QtCore.QTimer.singleShot(timeout * 1000, self.stop)
        QtCore.QTimer.singleShot(0, lambda: self._internal_func(0))
Checks the internal structure of the dictionary and makes necessary adjustments, 
dataset/ETHPy150Open LabPy/lantz/lantz/ui/blocks/loop.py/Loop.start--crossover with--dataset/ETHPy150Open erickrf/nlpnet/nlpnet/word_dictionary.py/WordDictionary.check