wxWidgets/utils/wxPython/lib/splashscreen.py
1999-11-20 21:15:12 +00:00

113 lines
3.9 KiB
Python

#----------------------------------------------------------------------
# Name: wxPython.lib.splashscreen
# Purpose: A simple frame that can display a bitmap and closes itself
# after a specified timeout or a mouse click.
#
# Author: Mike Fletcher, Robin Dunn
#
# Created: 19-Nov-1999
# RCS-ID: $Id$
# Copyright: (c) 1999 by Total Control Software
# Licence: wxWindows license
#----------------------------------------------------------------------
from wxPython.wx import *
#----------------------------------------------------------------------
def bitmapFromFile(filename):
'''Non-portable test for bitmap type...'''
import imghdr
BITMAPTYPEGUESSDICT = {
"bmp" :wxBITMAP_TYPE_BMP,
"png" :wxBITMAP_TYPE_PNG,
"jpeg":wxBITMAP_TYPE_JPEG,
"gif" :wxBITMAP_TYPE_GIF,
"xbm" :wxBITMAP_TYPE_XBM,
}
# following assumes bitmap type if we cannot resolve image type
typ = BITMAPTYPEGUESSDICT.get(imghdr.what(filename), wxBITMAP_TYPE_BMP)
bitmap = wxImage(filename, typ).ConvertToBitmap()
return bitmap
#----------------------------------------------------------------------
class SplashScreen(wxFrame):
def __init__(self, parent, ID=-1, title="SplashScreen", style=wxSTAY_ON_TOP,
duration=1500, bitmapfile="bitmaps/splashscreen.bmp", callback = None):
'''
parent, ID, title, style -- see wxFrame
duration -- milliseconds to display the splash screen
bitmapfile -- absolute or relative pathname, extension used for type negotiation
callback -- if specified, is called when timer completes, callback is responsible for closing the splash screen
'''
### Loading bitmap
self.bitmap = bmp = bitmapFromFile(bitmapfile)
### Determine size of bitmap to size window...
size = (bmp.GetWidth(), bmp.GetHeight())
# size of screen
width = wxSystemSettings_GetSystemMetric(wxSYS_SCREEN_X)
height = wxSystemSettings_GetSystemMetric(wxSYS_SCREEN_Y)
pos = ((width-size[0])/2, (height-size[1])/2)
# check for overflow...
if pos[0] < 0:
size = (wxSystemSettings_GetSystemMetric(wxSYS_SCREEN_X), size[1])
if pos[1] < 0:
size = (size[0], wxSystemSettings_GetSystemMetric(wxSYS_SCREEN_Y))
wxFrame.__init__(self, parent, ID, title, pos, size, style)
self.Show(true)
dc = wxClientDC(self)
dc.DrawBitmap(self.bitmap, 0,0, false)
class SplashTimer(wxTimer):
def __init__(self, targetFunction):
self.Notify = targetFunction
wxTimer.__init__(self)
if callback is None:
callback = self.OnSplashExitDefault
self.timer = SplashTimer(callback)
self.timer.Start(duration, 1) # one-shot only
EVT_LEFT_DOWN(self, self.OnMouseClick)
def OnSplashExitDefault(self, event=None):
self.Close(true)
def OnCloseWindow(self, event=None):
self.Show(false)
self.timer.Stop()
del self.timer
self.Destroy()
def OnMouseClick(self, event):
self.timer.Notify()
#----------------------------------------------------------------------
if __name__ == "__main__":
class DemoApp(wxApp):
def OnInit(self):
wxImage_AddHandler(wxJPEGHandler())
wxImage_AddHandler(wxPNGHandler())
wxImage_AddHandler(wxGIFHandler())
self.splash = SplashScreen(NULL, bitmapfile="splashscreen.jpg", callback=self.OnSplashExit)
self.splash.Show(true)
self.SetTopWindow(self.splash)
return true
def OnSplashExit(self, event=None):
print "Yay! Application callback worked!"
self.splash.Close(true)
del self.splash
### Build working windows here...
def test(sceneGraph=None):
app = DemoApp(0)
app.MainLoop()
test()