Hi JonB,
thanks for the hint.
Yes, wrapping everything in begin_update/end_update works for me as well.
Unfortunately, I was actually trying to make the "live update" visible, i.e. seeing every dot appear.
If that's not required it's straight forward to use the UI module instead, but live updates are actually relatively complex to do in there. I use this for educational purposes, so having a lot of (object oriented) code around this is quite counter-productive.
If I wrap every fill_ellipse call into begin_update/end_update (just for fun) i get exactly the same effect as without wrapping. Seems canvas doesn't like to be overloaded with update requests.