[gelöst] Splash Ladezeit

Plattformunabhängige GUIs mit wxWidgets.
Antworten
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Hallo miteinander,

ich habe ein Programm, dass sehr viele und große Unterprogramme beim Start importiert. Daher wollte ich die ladezeit mit einem Splash "verkürzen". Leider erscheint der Splash erst kurz vor dem erscheinen des Hauptfensters und nicht sofort.

Unten mal der abgemagerte (funktionierende) Beispielcode. Dieser lädt natürlich schnell, da nichts weiter importiert wird.

Frage: wie kann ich das Anzeigen des Splash beschleunigen oder kann ich das importieren der Module mit einem event verbinden??

Noch eine Frage nebenbei: das icon im Frame erscheint auf meinem 19'' Monitor (1600x1200), aber auf dem 24'' Monitor mit einer Auflösung von
1920x1200 leider nicht. Woran kann das liegen? Evtl. an der eingestellten Icon-Größe in Vista? Ich dachte das wird automatisch skaliert.

Gruß Mathi

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-


from wx.lib.embeddedimage import PyEmbeddedImage
import wx.lib.newevent

#import wx.html

wx.SetDefaultPyEncoding("iso-8859-15") 

#---------------------------------------------------------------------------------------
icon_stream = PyEmbeddedImage( 
    "iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAIAAABuYg/PAAAAA3NCSVQICAjb4U/gAAAEGUlE" 
    "QVRIie1WS0srSxCu6emeR2I0JiSKaBa+FSQouAnE4MJf4EIQf4Nu/DWu/AsuxIXg+4EgKi6S" 
    "nWJioiSZPCaJwzzSfRfNzQk65njlcs65cL/FMExX9Vf1dVX1APwnIAjCL3T7Nn4137+C7wTd" 
    "2UcQhHaDnxr/eB8eHl5bW8vlcoIgEEIsy6KUfvRhjImiGIlEtra2np+fAWBpaWl2dlbTNMYY" 
    "ACCECCG2bVNKRVHEGFuWBQCUUowxd8Tz8/Nzc3MrKyulUimTyUSjUcdxXMlkWdY0bXd3N5vN" 
    "MsYWFhbi8XgwGOTBSZJ0fn4ejUYlSUomkwMDA4FAgC/Jsvz6+rq3t4ebzWYkEqnVaoQQVVV1" 
    "Xbdt+7PMxsbGCoUCF+fl5WVgYCCfz1NKGWOKovT29jLGGo1GJBLRNA1j3Gw2GWOEkMHBQQBA" 
    "AKAoCteQEIIQ6iC9JEmcmDGGEEII8e+CIHAZMcaMMUmSJEniq3xJFEUAwAihnZ2diYkJALi5" 
    "uVldXQ2Hw65nLopiPp8fHR19eHgAgPHxcV3Xh4aGGGOU0re3t9PT03g8bhhGsVjEGCcSCUVR" 
    "uP7VahUAMKV0eXlZ13VCSDAYnJ6eFkXxHRljjAfY3d1dLBb5x83NTVVVDcOglHK5jo+P/X6/" 
    "YRhTU1PX19eTk5N8K+749vaGAcAwjEajIctyV1cXADSbTa4ML7P29xYTAFiWZdt2ywYAvF6v" 
    "YRiGYWCMVVVtbdVy/CE6AGCM27N5x+RaNe90hr+7sH2rFjDXVFEUQkh74P+I9YvACKGTk5NA" 
    "IEAIeXx8vLi46OnpeRdvJpPxeDwejwdjvLGxcXBw8E0yxtj09LSqqjx9RVF0XW+3IIRUKpX+" 
    "/n7Lsnp6ejKZzPczo5T6fD7TNAGAUsqPvd2Ct4tpmqZpejyeDnvxzmu1oIsBxvju7s5xHF3X" 
    "n56eeAO2wKdAKpXSNE3TtMPDw8+6HgDu7+8xxoIgFAqFcrnsklk6nXYc5+zsjAd1dHTUqleO" 
    "crkci8XC4XC1Wp2cnHSdnBwzMzN8NRQK1et1F7LLy8vLy8sO4gDA9vZ2JBIBAMbYu1DawRhz" 
    "HIcPFFezTzVph8/nE0Xxi3Xf4XpDnZc56vW6IAgfx9jXaThwIpFYX1/P5XKuiQuCUCqVGGOl" 
    "UknXddM0CSGdd+xE1tfXhzFeXFy0LMs1NITQ/v7++Pi43++/vb3tUI0/1RlTSkdGRqrV6mdk" 
    "siwPDQ3xHojFYh0KhLcNv9VcY8L82uSjCNwGICHE6/X6fD6MsSzL/ORck6jVapIkZbNZv9/v" 
    "qjaybTuVSpmmyWdH+9O2bcdxTNOsVCrJZLJarV5dXYVCoY9MXBKEkKZpyWQynU4Hg0GX3Fsh" 
    "fPZ39if+v/6emL7E+ifK9T9+O/4Ca6olvzq05dsAAAAASUVORK5CYII=" 
) 


#---------------------------------------------------------------------------------------------

class MySplashScreen(wx.SplashScreen): 
    """ 
Create a splash screen widget. 
    """ 

    
    def __init__(self, parent=None):
        
        geticon_streamData = icon_stream.GetData()
        geticon_streamImage = icon_stream.GetImage()
        geticon_streamBitmap = icon_stream.GetBitmap()
        bmp1=geticon_streamBitmap
        mask = wx.Mask(bmp1, wx.BLUE)
        bmp1.SetMask(mask)
        splashStyle = wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT 
        splashDuration = 1000 # milliseconds 

        wx.SplashScreen.__init__(self, bmp1, splashStyle, 
                                 splashDuration, parent) 
        wx.Yield()
       
#---------------------------------------------------------------------------


class MyFirstFrame(wx.Frame): 
    """ 
    Erster Frame 
    """ 
    
    def __init__(self, parent = None, id = -1, title = '*** Tools V2.01 ***'): 
        """ 
        Frame initialisieren und aufbauen 
        """ 

        # Initialisieren 
        wx.Frame.__init__(self, parent, id, title,size=(900,870), style=wx.DEFAULT_DIALOG_STYLE | wx.MINIMIZE_BOX ) 
        # Basispanel 
        panel = wx.Panel(self) 
        panel.SetBackgroundColour(wx.Colour(240,240,240))
        #Icon
        img = wx.ImageFromBitmap(icon_stream.GetBitmap()) 
        img.Rescale(16, 16) 
        bmp2 = wx.BitmapFromImage(img) 
        bmp2.SetMaskColour(wx.BLUE) 
        icon = wx.IconFromBitmap(bmp2)
        self.SetIcon(icon)
        # Font- Schriftart der Überschriften 
        font = wx.Font(10, wx.NORMAL, wx.NORMAL, wx.BOLD)

       
       
        # Frame zentrieren 
        if parent: 
            self.CenterOnParent(parent) 
        else: 
            self.Center() 
        
        # Frame anzeigen 
        self.Show() 
    
#-----------------------------------------------------------------------------------------------------------            
def main(): 
    """ 
    Hauptprozedur 
    """ 
    
    app = wx.App() 
    splash=MySplashScreen()
    splash.Show()
    first_frame = MyFirstFrame()
    first_frame.Center()
    first_frame.Show()
    app.MainLoop() 

if __name__ == "__main__": 
    main()
Zuletzt geändert von mathi am Mittwoch 4. Februar 2009, 07:56, insgesamt 1-mal geändert.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

:?
Ich wollte es mir ja ansehen, aber:
C:/Python25/pythonw.exe -u "c:/dokume~1/peter/lokale~1/temp/tmp-7qswj.py"
Traceback (most recent call last):
File "c:/dokume~1/c4s3/lokale~1/temp/tmp-7qswj.py", line 4, in <module>
from wx.lib.embeddedimage import PyEmbeddedImage
ImportError: No module named embeddedimage
IDE: DrPython
wxPython: 2.8.7.1
Python: 2.5.1

Wird wohl an meiner Version liegen, denke ich. Sorry, da muss ich wohl erst ein Update machen.
Gruß!
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

@C4S3

das liegt an wxPython, wurde mit Version 2.8.8.0 eingeführt, Du kannst ja das Splash Image auch einfach als jpg einbinden, hab ich nicht gemacht, um eine funktionierende Version hier einzustellen.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

http://wiki.wxpython.org/SplashScreen

Ich hatte sowas schon vermutet. ;)

Bei der OnExit()-Methode des Splashscreens wird dann das Frame Objekt erstellt.
In deinem Code läuft ja nach dem erzeugen des SplashScreen-Objekts das Programm weiter und erzeugt dann gleich den Frame.
Gruß!
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

vielen Dank, der erste Teil der Frage ist damit beantwortet,

hat jemand eine Idee warum das Icon nicht immer angezeigt wird??
Antworten