Acontece que substituir on_draw_shape resolve o problema, viz.
def on_draw_shape(self, ctx):
ctx.paint()
Não tenho certeza se essa é a solução correta, mas não sei ao certo para que serve o evento on_draw_shape e como ele difere do evento on_draw.