bl_info = { "name": "Modal Timer Add-on", "blender": (2, 80, 0), "category": "Object", } import bpy class ModalTimerOperator(bpy.types.Operator): bl_idname = "wm.modal_timer_operator" bl_label = "Modal Timer Operator" _timer = None def modal(self, context, event): if event.type == 'TIMER': print("Running Modal...") return {'PASS_THROUGH'} def execute(self, context): wm = context.window_manager self._timer = wm.event_timer_add(0.5, window=context.window) wm.modal_handler_add(self) return {'RUNNING_MODAL'} def cancel(self, context): wm = context.window_manager wm.event_timer_remove(self._timer) @bpy.app.handlers.persistent def load_post_func(scene): print("Load Post") bpy.ops.wm.modal_timer_operator() def register(): bpy.utils.register_class(ModalTimerOperator) bpy.app.handlers.load_post.append(load_post_func) def unregister(): bpy.utils.unregister_class(ModalTimerOperator) bpy.app.handlers.load_post.remove(load_post_func)