Drag and drop inside of canvas

Could you not just assume the mouse is still down unless you hear otherwise (via a mouse up event or the mouse coords move outside the confines of the canvas) ?

So, on mouse down event you set

self.dragging = True
self.element_im_moving = <whatever>

Then on the mouse move events you do

if self.dragging:
    # we are dragging - move self.element_im_dragging x/y accordingly

Then in mouse up event

if self.dragging:
    self.dragging = False
    # handle dropping