You can't add draw handler in register()
function in your addon, because it runs too early.
Use bpy.app.handlers
instead
https://docs.blender.org/api/current/bpy.app.handlers.html
bl_info = {
"name" : "Add draw handler to Viewport when start",
"author" : "me",
"version" : (23, 8, 1),
"blender" : (3, 4),
"location" : "View3d > Tool",
"warning" : "",
"description" : "Test",
"wiki_url" : "",
"category" : "3D View",
}
#### copy from https://docs.blender.org/api/3.6/gpu.html
import bpy
import gpu
from gpu_extras.batch import batch_for_shader
vertices = (
(100, 100), (300, 100),
(100, 200), (300, 200))
indices = (
(0, 1, 2), (2, 1, 3))
shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
batch = batch_for_shader(shader, 'TRIS', {"pos": vertices}, indices=indices)
def draw():
shader.uniform_float("color", (0, 0.5, 0.5, 1.0))
batch.draw(shader)
####
from bpy.app.handlers import persistent
@persistent
def when_version_update_end(dummy):
print("when_version_update_end")
bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_PIXEL')
def register():
bpy.app.handlers.version_update.append(when_version_update_end)
def unregister():
bpy.types.SpaceView3D.draw_handler_remove(draw, 'WINDOW')
if __name__ == "__main__":
register()