Turns out that the issue is that the interpreter hands out random errors, when a real error exists, but update has tried starting up and resulting timing issue is apparently the cause of the random errors. I was moving the missing attribute setup up in the setup code, and not fixing the hidden code issues.
The best advice was to comment out update and track down the actual errors.
Which turned out to be COLS & ROWS set up at the top of the script, were ignored and set up as a local variable in my def Paint_Photos(self) code
My solution was to declare them as global, still not clear why COLS & ROWS worked in the game example but not in my code! Thinking I should have passed ROWS and COLS to Paint_Photos
Thanks folks, I could not have made progress without the TLC of @JonB & @enceladus
(Truly Learned Coding!)
Btw delaying update simply changed the random errors??!!