6

Actualmente tengo una pantalla de bienvenida en su lugar. Sin embargo, no funciona como una pantalla de bienvenida real, ya que detiene la ejecución del resto del código (en lugar de permitir que se ejecuten en segundo plano).¿Cómo adaptar mi pantalla de presentación actual para permitir que otras partes de mi código se ejecuten en segundo plano?

Esta es la arquitectura actual (reducida) de mi programa, con los bits importantes mostrados en su totalidad. ¿Cómo puedo adaptar la pantalla de presentación actual para permitir que el resto del programa se cargue en segundo plano? ¿Es posible en Python?

Gracias!

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() 

Gracias por toda la ayuda, así es como he cambiado el código (siguiendo el consejo proporcionado):

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() 

Respuesta

12

Su código es bastante complicado/complicado. No es necesario anular wx.SplashScreen y no hay razón por la que su evento de cierre de pantalla salte deba crear la ventana principal de la aplicación. Así es como hago 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() 

Simplemente cree la pantalla de presentación lo antes posible sin tiempo de espera. Continúa cargando y crea la ventana principal de tu aplicación. A continuación, destruya la pantalla de bienvenida para que desaparezca. Mostrar la pantalla de bienvenida no impide que ocurra otro procesamiento.

+0

Muchas gracias. Estoy dando una oportunidad. – relima

0

Usted querrá utilizar dos hilos: uno para la pantalla de bienvenida, uno para cualquier otro código que quiera ejecutar. Ambos hilos se ejecutarán al mismo tiempo, proporcionando el resultado que desee.

+0

Existe un problema: nunca he usado subprocesos. He intentado hacer que funcione, pero no tengo idea de cómo implementarlo. Esperaba aprender de las respuestas a esta pregunta. – relima

+0

Echa un vistazo a algunos artículos en línea sobre el tema. Encontré este que puede ayudar: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python – Bernard

+0

No se necesitan hilos aquí. La pantalla de bienvenida no bloquea la ejecución si se usa correctamente. – FogleBird

Cuestiones relacionadas