views:

54

answers:

2

Currently I have a splash screen in place. However, it does not work as a real splash screen - as it halts the execution of the rest of the code (instead of allowing them to run in the background).

This is the current (reduced) arquitecture of my program, with the important bits displayed in full. How can I adapt the splash screen currently in place to actually allow the rest of the program to load in the background? Is it possible in python?

Thanks!

import ...
(many other imports)
def ...
def ...
(many other definitions)

class VFrams(wxFrame):
    wx.Frame.__init__(self, parent, -1, _("Software"), 
                      size=(1024, 768), style=wx.DEFAULT_FRAME_STYLE)
    (a lot of code goes in here)

class MySplashScreen(wx.SplashScreen):
    def __init__(self, parent=None):
        aBitmap = wx.Image(name=VarFiles["img_splash"]).ConvertToBitmap()
        splashStyle = wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT
        splashDuration = 5000 # ms
        wx.SplashScreen.__init__(self, aBitmap, splashStyle, splashDuration, parent)
        self.Bind(wx.EVT_CLOSE, self.CloseSplash)
        wx.Yield()
    def CloseSplash(self, evt):
        self.Hide()
        global frame
        frame = VFrame(parent=None)
        app.SetTopWindow(frame)
        frame.Show(True)
        evt.Skip()

class MyApp(wx.App):
    def OnInit(self):
        MySplash = MySplashScreen()
        MySplash.Show()
        return True

if __name__ == '__main__':
    DEBUG = viz.addText('DEBUG:', viz.SCREEN)
    DEBUG.setPosition(0, 0)
    DEBUG.fontSize(16)
    DEBUG.color(viz.BLACK)
    Start_Mainvars()        
    Start_Config()
    Start_Translation()
    Start_DB()
    Start_Themes()
    Start_Gui()
    Start_Get_Isos()
    Start_Bars()
    Start_Menus()
    Start_Event_Handlers()
    app = MyApp()
    app.MainLoop()

Thank you for all the help, this is how I changed the code (following the provided advice):

def show_splash():
    # create, show and return the splash screen
    global splash
    bitmap = wx.Image(name=VarFiles["img_splash"]).ConvertToBitmap()
    splash = wx.SplashScreen(bitmap, wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_NO_TIMEOUT, 0, None, -1)
    splash.Show()
    return splash

class MyApp(wx.App):
    def OnInit(self):
        global frame, splash
        splash = show_splash()
        Start_Config()
        Start_Translation()
        Start_DB()
        Start_Themes()
        Start_Gui()
        Start_Get_Isos()
        Start_Bars("GDP1POP1_20091224_gdp", "1 pork")
        Start_Menus()
        Start_Event_Handlers()
        frame = VFrame(parent=None)
        frame.Show(True)
        splash.Destroy()
        return True

if __name__ == '__main__':
    DEBUG = viz.addText('DEBUG:', viz.SCREEN)
    DEBUG.setPosition(0, 0)
    DEBUG.fontSize(16)
    DEBUG.color(viz.BLACK)
    Start_Mainvars()   
    app = MyApp()
    app.MainLoop()
A: 

You'll want to use two threads: one for the splash screen, one for whatever other code you want to execute. Both threads would run at the same time, providing the result you desire.

Bernard
There is a problem: I have never used threads. I have been trying to get it to work, but I have no clue as to how to get it in place. I was expecting to learn from the answers to this question.
relima
Check out some articles online on the subject. I found this one that may help: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python
Bernard
No threads are needed here. The splash screen doesn't block execution if used properly.
FogleBird
+4  A: 

Your code is pretty messy/complicated. There's no need to override wx.SplashScreen and no reason your splash screen close event should be creating the main application window. Here's how I do splash screens.

import wx

def show_splash():
    # create, show and return the splash screen
    bitmap = wx.Bitmap('images/splash.png')
    splash = wx.SplashScreen(bitmap, wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_NO_TIMEOUT, 0, None, -1)
    splash.Show()
    return splash

def main():
    app = wx.PySimpleApp()
    splash = show_splash()

    # do processing/initialization here and create main window
    frame = MyFrame(...)
    frame.Show()

    splash.Destroy()
    app.MainLoop()

if __name__ == '__main__':
    main()

Just create the splash screen as soon as possible with no timeout. Continue loading and create your application's main window. Then destroy the splash screen so it goes away. Showing the splash screen doesn't stop other processing from happening.

FogleBird
Thank you very much. I am giving this a try.
relima