using widget after events the main drawback of this first approach is that only one animation can be going at onceif you press "ror "owhile move is in progressthe new request puts the prior movement on hold until it finishes because each move callback handler assumes the only thread of control while it runs that isonly one time sleep loop callback can be running at timeand new one started by an update call is effectively recursive call which pauses another loop already in progress screen updates are bit sluggish while moves are in progresstoobecause they happen only as often as manual update calls are made (try drag-out or cover/uncover of the window during move to see for yourselfin factuncommenting the canvas update call in example - makes the gui completely unresponsive during the move--it won' redraw itself if covereddoesn' respond to new user requestsand doesn' show any of its progress (you only get to see the final statethis effectively simulates the impact of long-running operations on guis in general example - specializes just the moveinsquares method of the prior example to remove all such limitations--by using after timer callback loopsit schedules moves without potential pauses it also reflects the most common (and likely bestway that tkinter guis handle time-based events at large by breaking tasks into parts this way instead of running them all at oncethey are naturally both distributed over time and overlapped time toolsthreadsand animation