wxPython before MainLoop
7stud
bbxx789_05ss at yahoo.com
Thu Aug 9 03:50:07 EDT 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)
You can use a separate 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,
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):
the_frame = MyFrame()
the_frame.Show()
t = MyThread(the_frame)
t.start() #calls run() in t's class
return True
class MyThread(threading.Thread):
def __init__(self, a_frame):
threading.Thread.__init__(self)
self.frame_obj = a_frame
def run(self):
self.result = self.long_slow_init()
def long_slow_init(self):
print "starting long_slow_init()..."
time.sleep(6)
result = 20.5
#Send result to frame:
wx.CallAfter(self.frame_obj.receive_result, result)
app = MyApp()
app.MainLoop()
----------------------------
More information about the Python-list
mailing list