py-loading-screen 1.1.6
Animated loading screen
Requires Python: >=3.0

# py-loading-screen

Module for Python - animated loading screen
Used modules:
  1. asyncio
  2. math
  3. time.sleep
  4. PyQt5.QtCore, PyQt5.QtWidgets, PyQt5.QtGui

Tested on python: 3.7.4, windows: x32, x64

**Installing:**

    $ pip install py-loading-screen

**import:**

    $ from pyLoadingScreen import LoadingScreen

If 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 = 1440


# **Notes:**

    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 fixes
+ Description has been supplemented


## **v1.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 application
+ Improved animation quality by using float type coordinates instead of integer type
+ Renamed param "animationFacesCount" to "animationDetailРЎoefficient"


## **v1.0.3:**
+ Bug fixes


## **v1.0.2:**
+ Release on PyPI, now module is available using pip: 'pip install py-loading-screen'