8

Pyinstaller recently added a splash screen option (yay!) but the splash stays open the entire time the exe is running. I need it because my file opens very slowly and I want to warn the user not to close the window. Is there a way I can get the splash screen to close when the gui opens?

Rex Nihilo
  • 604
  • 2
  • 7
  • 16
Sasha Halpern
  • 93
  • 1
  • 10

4 Answers4

5

from pyinstaller docs:

import pyi_splash

# Update the text on the splash screen
pyi_splash.update_text("PyInstaller is a great software!")
pyi_splash.update_text("Second time's a charm!")

# Close the splash screen. It does not matter when the call
# to this function is made, the splash screen remains open until
# this function is called or the Python program is terminated.
pyi_splash.close()
ozs
  • 3,051
  • 1
  • 10
  • 19
1

I had this same issue, and even though this post is old i could not find the answer :) but i was able to figure out a way to make the splash screen go away.

Once your spec file is generated using the '--splash=picture.png' modify the spec file

Parameter to mod

always_on_top=True -> set to always_on_top=False

Then rerun the pyinstaller command using the modified spec file -> pyinstaller main.spec

pyro
  • 11
  • 1
  • The splash screen doesn't go away, it is just that your application window can open in front of it. If you move your application window you still see it. – tinman Jan 25 '23 at 22:00
  • At least this makes the splash screen go away when the application closes... – Dgomn D Jun 19 '23 at 15:42
1
import sys

if getattr(sys, 'frozen', False):
    import pyi_splash

# your code..........

if getattr(sys, 'frozen', False):
    pyi_splash.close()

#root.mainloop()

See: https://coderslegacy.com/python/splash-screen-for-pyinstaller-exe/

(To run splash you must specify during pyinstaller build --splash=The_image_you_choose.png #or .jpg)

0

Another interesting approach could be the following. As described in the Pyinstaller documentation, the pyi_splash module cannot be installed by a package manager because it is part of PyInstaller, so you should put the import statement within a try ... expect block. However, something like

try:
    import pyi_splash
except:
    pass

is an anti-pattern in Python.

Thus, to properly load your splash screen and having it closed when the application starts while being pythonic, you can do the following:

from contextlib import suppress
from PyQt5.QtWidgets import QApplication

from ui import YourAppUI

def main():
    if not QApplication.instance():
        app = QApplication(sys.argv)
    else:
        app = QApplication.instance()

    app.setStyle("Fusion")
    ui = YourAppUI()
    ui.show()
    with suppress(ModuleNotFoundError):
        import pyi_splash  # noqa

        pyi_splash.close()
    app.exec_()


if __name__ == "__main__":
    main()

(# noqa is one of those comments that can be read by your IDE to suppress warnings)

To know more about this context manager, take a look here or in the docs.

blunova
  • 2,122
  • 3
  • 9
  • 21