6

Momentan habe ich einen Begrüßungsbildschirm an Ort und Stelle. Es funktioniert jedoch nicht wie ein echter Startbildschirm - da es die Ausführung des restlichen Codes stoppt (anstatt sie im Hintergrund laufen zu lassen).Wie kann ich meinen aktuellen Begrüßungsbildschirm anpassen, damit andere Teile meines Codes im Hintergrund ausgeführt werden können?

Dies ist die aktuelle (reduzierte) Architektur meines Programms, wobei die wichtigen Bits vollständig angezeigt werden. Wie kann ich den aktuellen Begrüßungsbildschirm anpassen, damit der Rest des Programms im Hintergrund geladen werden kann? Ist es in Python möglich?

Danke!

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

Vielen Dank für all die Hilfe, das ist, wie ich den Code geändert (im Anschluss an die beratend):

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

Antwort

12

Ihr Code ist ziemlich chaotisch/kompliziert. Es besteht keine Notwendigkeit, wx.SplashScreen zu überschreiben, und es gibt keinen Grund dafür, dass das Ereignis zum Schließen des Begrüßungsbildschirms das Hauptanwendungsfenster erstellt. Hier ist, wie ich Bildschirme splash.

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

Erstellen Sie den Begrüßungsbildschirm so schnell wie möglich ohne Zeitüberschreitung. Fahren Sie mit dem Laden fort und erstellen Sie das Hauptfenster Ihrer Anwendung. Dann zerstöre den Begrüßungsbildschirm, damit er verschwindet. Wenn der Begrüßungsbildschirm angezeigt wird, wird die Verarbeitung nicht gestoppt.

+0

Vielen Dank. Ich versuche es. – relima

0

Sie werden zwei Threads verwenden möchten: eine für den Splash-Screen, eine für jeden anderen Code, den Sie ausführen möchten. Beide Threads laufen gleichzeitig und liefern das gewünschte Ergebnis.

+0

Es gibt ein Problem: Ich habe noch nie Threads verwendet. Ich habe versucht, es zur Arbeit zu bringen, aber ich habe keine Ahnung, wie ich es an Ort und Stelle bringen soll. Ich hatte erwartet, aus den Antworten auf diese Frage zu lernen. – relima

+0

Schauen Sie sich online einige Artikel zum Thema an. Ich habe dieses gefunden, das helfen kann: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python – Bernard

+0

Hier sind keine Threads erforderlich. Der Begrüßungsbildschirm blockiert die Ausführung bei ordnungsgemäßer Verwendung nicht. – FogleBird

Verwandte Themen