Skip to content

marcohenning/pyqt-loading-button

Repository files navigation

PyQt Loading Button

PyPI Python License Coverage Build

A QPushButton with built-in loading animations for PyQt and PySide.

Main

About

The widget functions exactly like PyQt's regular QPushButton with the only exception being the way methods are connected to the clicked event. Normally you would connect a method to the clicked event by using the connect() method. On this button you use the setAction() method instead, passing a callable object as its parameter the same way you would do with the connect() method. The method will then get executed in a QThread, allowing the button to display a loading animation.

Installation

pip install pyqt-loading-button

Example

import time
from PyQt6.QtGui import QColor
from PyQt6.QtWidgets import QMainWindow
from pyqt_loading_button import LoadingButton, AnimationType


class Window(QMainWindow):

    def __init__(self):
        super().__init__(parent=None)

        # LoadingButton
        self.button_1 = LoadingButton(self)
        self.button_1.setText('Click me!')
        self.button_1.setAnimationType(AnimationType.Circle)
        self.button_1.setAnimationSpeed(2000)
        self.button_1.setAnimationColor(QColor(0, 0, 0))
        self.button_1.setAnimationWidth(15)
        self.button_1.setAnimationStrokeWidth(3)
        self.button_1.setAction(self.do_something)

    def do_something(self):
        time.sleep(5)  # Simulate long task

Documentation

  • Setting the button text:
loading_button.setText('Click me!')
  • Setting the action connected to the clicked event:
def do_something():
    time.sleep(5)  # Simulate long task

loading_button.setAction(do_something)
  • Setting the animation type:
loading_button.setAnimationType(AnimationType.Circle)  # Circular animation
loading_button.setAnimationType(AnimationType.Dots)    # Dotted animation
  • Setting the animation speed:
# 2000 means each loop of the animation takes 2000 ms to complete
loading_button.setAnimationSpeed(2000)
  • Setting the animation width:
loading_button.setAnimationWidth(15)  # Total width of the animation is 15 px
  • Setting the animation stroke width:
loading_button.setAnimationStrokeWidth(3)  # Stroke width of the brush is 3 px
  • Setting the animation color:
loading_button.setAnimationColor(QColor(0, 0, 0))
  • Checking whether the action is currently being executed:
loading_button.isRunning()


All methods:

Method Description
text(self) Get the current button text
setText(self, text: str) Set the button text
setAction(self, action: callable) Set the action connected to the clicked event
isRunning(self) Get whether the action is currently being executed
getAnimationType(self) Get the current animation type
setAnimationType(self, animation_type: AnimationType) Set the animation type
getAnimationSpeed(self) Get the current animation speed (time it takes the animation to complete one loop in ms)
setAnimationSpeed(self, speed: int) Set the animation speed (time it takes the animation to complete one loop in ms)
getAnimationWidth(self) Get the current width of the animation
setAnimationWidth(self, width: int) Set the width of the animation
getAnimationStrokeWidth(self) Get the current width of the brush stroke
setAnimationStrokeWidth(self, width: int) Set the width of the brush stroke
getAnimationColor(self) Get the current animation color
setAnimationColor(self, color: QColor) Set the animation color

License

This software is licensed under the MIT license.