6

Actuellement, j'ai un écran de démarrage en place. Cependant, il ne fonctionne pas comme un véritable écran de démarrage - car il arrête l'exécution du reste du code (au lieu de leur permettre de s'exécuter en arrière-plan).Comment adapter mon écran de démarrage actuel pour permettre à d'autres parties de mon code de tourner en arrière-plan?

C'est l'architecture actuelle (réduite) de mon programme, avec les bits importants affichés en entier. Comment puis-je adapter l'écran de démarrage actuellement en place pour permettre au reste du programme de se charger en arrière-plan? Est-ce possible en python?

Merci!

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

Merci pour toute l'aide, voici comment je l'ai changé le code (suivant les conseils fournis):

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

Répondre

12

Votre code est assez compliqué/compliqué. Il n'est pas nécessaire de surcharger wx.SplashScreen et aucune raison pour que votre événement de fermeture de l'écran de démarrage ne crée la fenêtre principale de l'application. Voici comment je fais splash écrans. Il suffit de créer l'écran de démarrage dès que possible sans délai d'expiration. Continuez le chargement et créez la fenêtre principale de votre application. Puis détruisez l'écran de démarrage afin qu'il disparaisse. L'affichage de l'écran de démarrage n'empêche pas les autres traitements de se produire.

+0

Merci beaucoup. Je suis en train d'essayer. – relima

0

Vous voulez utiliser deux fils: l'un pour l'écran d'accueil, un pour tout autre code que vous voulez exécuter. Les deux threads fonctionneraient en même temps, fournissant le résultat que vous désirez.

+0

Il y a un problème: je n'ai jamais utilisé de threads. J'ai essayé de le faire fonctionner, mais je n'ai aucune idée de la façon de le mettre en place. Je m'attendais à apprendre des réponses à cette question. – relima

+0

Découvrez quelques articles en ligne sur le sujet. J'ai trouvé celui qui peut aider: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python – Bernard

+0

Aucun fil n'est nécessaire ici. L'écran de démarrage ne bloque pas l'exécution s'il est utilisé correctement. – FogleBird