Well, running the code shows nothing for me.
I totally expect that because you define some classes but instantiate anything :-)
I suppose that you forgot to paste some more lines.
Adding
if __name__ == '__main__':
client = Client()
client.run()
at the end of your script I got a visual of a live widget: it displays, can be dragged, reacts visually and in console to mouse clicks.
Snapshot attached.
Your code looks right [0]
If you can confirm that adding the two lines you don't see a widget, then I would suspect you need to set some gl state (expected by pywidget) just before calling draw.
As a blind and easy stab, you can try adding
glColor4ub(255, 255, 255, 255)
just before the line
self.dialog.on_draw()
[0]nitpick: you are not calling super in the overrided methods on_enter and on_exit, which in general will stop the propagation of on_enter on_exit to childs.
Is not a problem with this particular script because the node has no childs, but is better to be consistent in the code.