Your heavy function needs to occasionally let the GUI process accumulated events. For example, you can occasionally run:
while gtk.events_pending():
gtk.main_iteration()
Another option is for the heavy function to run in a separate thread, leaving the main thread to process the events and spin the spinner. In that case, you will need to redesign your create_image
function to be asynchronous. For example:
def create_image(self, spinner, finishcb):
spinner.start()
def thread_run():
# call heavy here
heavy_ret = heavy()
gobject.idle_add(cleanup, heavy_ret)
def cleanup(heavy_ret):
spinner.stop()
t.join()
finishcb(heavy_ret)
# start "heavy" in a separate thread and immediately
# return to mainloop
t = threading.Thread(thread_run)
t.start()
Now, instead of calling create_image
, you need to pass it a callback that will be called when the image is ready. I.e., instead of:
image = self.create_image(spinner)
you write:
self.create_image(spinner, self.store_created_image)