I did a code to display a splash-screen when my programm is opening.
def main():
application = wx.App(False)
splash = show_splash()
frame = MainWindow()
frame.Show(True)
splash.Destroy()
application.MainLoop()
But the splash-screen appears and disappears juste before the program close. I fixed it with two lines of code but it's ugly:
def main():
application = wx.App(False)
splash = show_splash()
frame = MainWindow()
frame.Show(True)
splash.Destroy()
splash.Hide()
application.MainLoop()
plash.Destroy()
My question is: Why the splashscreen appears when I close the programm with the first code and have you a best solution instead of the second code?
Have a look at the wxPython demo. The actual demo code has a splash screen. It implements a 'MyApp' and the splash is created shown within the OnInit method.
Here a working sample based on some stuff I did some time ago and what is done in the demo.
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import wxversion
wxversion.select('3.0-classic', True)
import wx
from wx.lib.mixins.inspection import InspectionMixin
import wx.lib.sized_controls as sc
print(wx.VERSION_STRING)
class MySplashScreen(wx.SplashScreen):
def __init__(self):
#bmp = wx.Image(opj(os.path.abspath(os.path.join(os.path.split(__file__)[0],"bitmaps","splash.png")))).ConvertToBitmap()
bmp = wx.ArtProvider.GetBitmap(wx.ART_QUESTION, wx.ART_OTHER, wx.Size(64, 64))
wx.SplashScreen.__init__(self, bmp,
wx.SPLASH_CENTER_ON_SCREEN | wx.SPLASH_TIMEOUT, # | wx.STAY_ON_TOP,
3000, None, -1)
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.fc = wx.FutureCall(2000, self.ShowMain)
def OnClose(self, evt):
# Make sure the default handler runs too so this window gets
# destroyed
evt.Skip()
self.Hide()
# if the timer is still running then go ahead and show the
# main frame now
if self.fc.IsRunning():
self.fc.Stop()
self.ShowMain()
def ShowMain(self):
frame = MainFrame(None, title="A sample frame")
frame.Show()
if self.fc.IsRunning():
self.Raise()
class MainFrame(sc.SizedFrame):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE|wx.FULL_REPAINT_ON_RESIZE|wx.TAB_TRAVERSAL
super(MainFrame, self).__init__(*args, **kwds)
self.SetTitle("A sample")
self.Centre(wx.BOTH)
paneContent = self.GetContentsPane()
# lets add a few controls
for x in range(5):
wx.StaticText(paneContent, -1, 'some string %s' % x)
paneBtn = sc.SizedPanel(paneContent)
paneBtn.SetSizerType('horizontal')
# and a few buttons
for x in range(3):
wx.Button(paneBtn, -1, 'a button %s' % x)
self.Fit()
class BaseApp(wx.App, InspectionMixin):
"""The Application, using WIT to help debugging."""
def OnInit(self):
"""
Do application initialization work, e.g. define application globals.
"""
self.Init()
self._loginShown = False
splash = MySplashScreen()
return True
if __name__ == '__main__':
app = BaseApp()
app.MainLoop()