Package: py-loading-screen
py-loading-screenModule for Python - animated loading screen
Used modules:asynciomathtime.sleepPyQt5.QtCore, PyQt5.QtWidgets, PyQt5.QtGuiTested on python: 3.7.4, windows: x32, x64Installing:$ pip install py-loading-screenimport:$ from pyLoadingScreen import LoadingScreenIf by some reason you have not python interpreter - you can see compiled demo-application (windows): 'example\compiled'LoadingScreen(PyQt5.QtWidgets.QFrame)Params:texts = ['Loading', 'Loading.', 'Loading..', 'Loading...'],
textUpdateDelay = 0.75,

parentWidget = None,
windowSize = (350, 350),
mainStyleSheet = "background-color: black; color: rgb(80, 0, 255);",
mainFrameWidth = 3,
textLabelStyleSheet = "background-color: black; color: white; font: bold 18px;",

animationType = "RoundRobin",       # Animation types available: "RoundRobin", "RibbonDance"
animationDetailРЎoefficient = 20,
animationRGBColor = (255, 0, 0),
animationColorRainbow = True,
animationColorRainbowStep = 2,
animationColorRainbowMinValues = (0, 0, 0),
animationColorRainbowMaxValues = (255, 255, 255),
animationLineWidth = 3,
animationScale = 0.95,
animationCountStepsPerRound = 1440Notes:1. I recommend running this in a new thread. Anyway, you need to create instance of LoadingScreen at main thread, then start worker function in any thread.
    If you want to start in new 'clear' thread - use 'worker' function, else if you wont to create task with asyncio - use 'worker_asyncio' coroutine.

    !!! Variable with LoadingScreen instance must exist all time while script is running !!!

    - New thread start full example:
    "
        from pyLoadingScreen import LoadingScreen
        from threading import Thread
        from PyQt5 import QtWidgets

        app = QtWidgets.QApplication([])
        screen = LoadingScreen()

        thread = Thread(target=screen.worker)
        thread.start()

        app.exec()
     "
    - Asyncio create task example (in this case, you still canвЂ™t use main thread for loop, becouse it will be busy by app.exec() loop (see above)):
    "
        ...
        self.screen = LoadingScreen()
        loop = asyncio.get_event_loop()
        asyncio.gather(self.screen.worker_async(), loop=loop)
        ...
    "

2. To stop work use 'exit' attribute of LoadingScreen instance or create attribute 'exit_' in 'worker' or 'worker_async' function.
    Work is stop after some time after signal to exit. You can check LoadingScreen instance state by 'isRunning' attribute.
    Example:
    "
        from pyLoadingScreen import LoadingScreen
        from threading import Thread
        from PyQt5 import QtWidgets
        from time import sleep

        def kill_after_5_seconds(screenInstance: object):
            sleep(5)
            screenInstance.exit = True
            screenInstance.worker.__dict__['exit_'] = True
                    # Equivalent to 'self.screen.exit = True'
            screenInstance.worker_async.__dict__['exit_'] = True
                    # Equivalent to 'self.screen.exit = True',
                    # but in this case - it will not take any effect,
                    # because 'worker' is using instead ('thread = Thread(target=screen.worker)')

            while True:
                if screenInstance.isRunning:
                    print("LoadingScreen is still running")
                else:
                    print("LoadingScreen is not running now!")
                    print()
                    input("Press ENTER to exit.")
                    break

        app = QtWidgets.QApplication([])
        screen = LoadingScreen()

        thread = Thread(target=screen.worker)
        thread.start()

        threadMonitoring = Thread(target=kill_after_5_seconds, args=(screen,))
        threadMonitoring.start()

        app.exec()
    "


3. If you set parentWidget - don't forget add LoadingScreen to parentWidget's layout!
    Example:
    "
        ...
        self.screen = LoadingScreen(parentWidget=self.ui.myParentWidget)
        self.ui.myParentWidget.layout().addWidget(self.screen)
        ...
    "
4. If animationColorRainbow == True, then param 'animationRGBColor' ignored

5. If animationColorRainbow == False, then params ignored:
    animationColorRainbowStep,
    animationColorRainbowMinValues,
    animationColorRainbowMaxValues

6. animationCountStepsPerRound - speed of rotation. animationCountStepsPerRound increases - rotation speed decreases

7. By some reason i can't create instance of LoadingScreen in Spyder (Anaconda, Python 3.7.4), but in outer program this work fine.Versions:v1.1.6:Bug fixesDescription has been supplementedv1.1.5:Restyled "RibbonDance" animation.v1.1.4:Added 2nd animation type - "RibbonDance". Now available 2 animation types: "RoundRobin" (default) and "RibbonDance"Added selection of animation type in example applicationImproved animation quality by using float type coordinates instead of integer typeRenamed param "animationFacesCount" to "animationDetailРЎoefficient"v1.0.3:Bug fixesv1.0.2:Release on PyPI, now module is available using pip: 'pip install py-loading-screen'