2016-05-15 28 views
0

Ich habe Probleme mit WxPython und animierte (GIF) Splash während der langen Einnahme-Funktion. Bisher habe ich:Animierte Splash in WxPython

class Splash(wx.SplashScreen): 

    def __init__(self, parent=None, id=-1): 

     image = "spinner.gif" 
     aBitmap = wx.Image(name =image).ConvertToBitmap() 
     splashStyle = wx.SPLASH_CENTRE_ON_PARENT 
     splashDuration = 0 # milliseconds 
     wx.SplashScreen.__init__(self, aBitmap, splashStyle, 
           splashDuration, parent) 

     gif = wx.animate.GIFAnimationCtrl(self, id, image,) 

     self.Show() 
     self.gif = gif 

    def Run(self,): 
     self.gif.Play() 

Ich möchte wie etwas tun:

splash = Splash() 
splash.Run() 
result = very_time_consuming_function() 
splash.Close() 
... 
use the result 

Jede Eingabe wird

Antwort

1

erkannt werden, sollten Sie die Zeit raubende Arbeit auf einem anderen Thread ausführen, sonst GUI blockieren und nicht antworten.

  • Lassen Sie einen Worker Thread die zeitraubende Aufgabe ausführen.
  • Nachdem Sie die Aufgabe abgeschlossen haben, informieren Sie den GUI-Thread, damit der Splash zerstört wird. Hier

ist ein Ausschnitt:

import wx 
import wx.animate 
from threading import Thread 
import time 

def wrap_very_time_consuming_function(): 
    print "sleeping" 
    time.sleep(5) # very time consuming function 
    print "waking up" 
    wx.CallAfter(splash.gif.Stop) 
    return 0 

app = wx.App() 
splash = Splash() 
splash.Run() 
Thread(target=wrap_very_time_consuming_function).start() 
app.MainLoop() 
+0

Aber ich brauche den Rückgabewert der Funktion zu verwenden. Grundsätzlich möchte ich die Hauptfunktion "warten" lassen bis die andere Funktion beendet ist und weiter auf den Rückgabewert zurückgreifen und in der Zwischenzeit den Splash-Drall haben. Ich habe auch versucht, den Splash in einem separaten Thread zu starten und die Funktion von der Hauptfunktion aufzurufen, aber ich lasse die Animation nur im Hauptthread laufen. – Magen