wxPython before MainLoop

7stud bbxx789_05ss at yahoo.com
Thu Aug 9 18:03:58 CEST 2007

On Aug 8, 11:25 pm, "[david]" <da... at nospam.spam> wrote:
> I'd like to refresh the display before I start the main loop.
> I have code like this:
> app = App()
> app.Show()
> app.long_slow_init()
> app.MainLoop()
> The main frame partly loads at Show, but because the mainloop has not
> started yet, the display does not update until long_slow_init() finishes.
> Alternatively, I could code
> app = App()
> app.long_slow_init()
> app.Show()
> app.MainLoop()
> Which would give me a crisp Show, but there would be a long slow wait
> before the app showed any activity at all. I would need a splash screen.
> I'd rather not have a splash screen (and I don't know how anyway). I'd
> like to just make app.Show() finish correctly before running
> long_slow_init.
> Is there a wx internal method that I can use to give Windows the
> opportunity to finish painting the frame before I run long_slow_init()?
> Or is there a better idea?
> (david)

I don't see my original post, so here it is again....

You can use another thread to execute long_slow_init():

import wx
import threading
import time

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "My Window")

        panel = wx.Panel(self, -1)
        button = wx.Button(panel, -1, "click me, quick!", pos=(40,
        self.Bind(wx.EVT_BUTTON, self.onclick)

    def onclick(self, event):
        print "button clicked"

    def receive_result(self, result):
        print "Hey, I'm done with that long, slow initialization."
        print "The result was:", result

class MyApp(wx.App):
    def __init__(self):
        wx.App.__init__(self, redirect=False)

    def OnInit(self):  #called by wx.Python
        the_frame = MyFrame()

        t = MyThread(the_frame)
        t.start()  #calls t.run()

        return True

class MyThread(threading.Thread):
    def __init__(self, a_frame):
        self.frame_obj = a_frame

    def run(self):
        result = self.long_slow_init()

        wx.CallAfter(self.frame_obj.receive_result, result)
        #CallAfter() calls the specified function with the
        #specified argument when the next pause in execution
        #occurs in this thread:

    def long_slow_init(self):
        print "starting long_slow_init()..."
        result = 20.5
        return result

app = MyApp()

More information about the Python-list mailing list