Skip to content

Instantly share code, notes, and snippets.

@ahmed4end
Last active October 29, 2023 06:50
Show Gist options
  • Save ahmed4end/33183727317afd840f52385df66b4403 to your computer and use it in GitHub Desktop.
Save ahmed4end/33183727317afd840f52385df66b4403 to your computer and use it in GitHub Desktop.
pyqt5 QPushButton animation example.
from PyQt5 import QtWidgets, QtGui, QtCore
from colour import Color # pip install colour
class Main(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setStyleSheet("QPushButton{height: 30px;width: 200px;}")
layout = QtWidgets.QHBoxLayout()
btn = Button("2020 is an interesting year.")
layout.addStretch()
layout.addWidget(btn)
layout.addStretch()
self.setLayout(layout)
class Button(QtWidgets.QPushButton):
def __init__(self, parent=None):
super().__init__(parent)
self.shadow = QtWidgets.QGraphicsDropShadowEffect()
self.setGraphicsEffect(self.shadow)
self.tm = QtCore.QBasicTimer()
self.shadow.setOffset(0, 0)
self.shadow.setBlurRadius(20)
self.shadow.setColor(QtGui.QColor("#3F3F3F"))
self.mouse = ''
self.changeColor(color="lightgrey")
#button shadow grading.
self.expand = 0
self.maxExpand = 4 # expanding size - #optional
self.init_s_color = "#3F3F3F" #optional
self.end_s_color = "#FFFF33" #optional
self.garding_s_seq = self.gradeColor(c1=self.init_s_color,
c2=self.end_s_color,
steps=self.maxExpand)
#button color grading.
self.grade = 0
self.maxGrade=15 # gradding size - #optional
self.init_bg_color = "lightgrey" #optional
self.end_bg_color = "darkgrey" #optional
self.gradding_bg_seq = self.gradeColor( c1=self.init_bg_color,
c2=self.end_bg_color,
steps=self.maxGrade)
def changeColor(self, color=(255,255,255)):
palette = self.palette()
palette.setColor(QtGui.QPalette.Button, QtGui.QColor(color))
self.setPalette(palette)
def gradeColor(self, c1, c2, steps):
return list([str(i) for i in Color(c1).range_to(Color(c2), steps)])
def enterEvent(self, e) -> None:
self.mouse = 'on'
#self.setGraphicsEffect(self.shadow)
self.tm.start(15, self)
def leaveEvent(self, e) -> None:
self.mouse = 'off'
def timerEvent(self, e) -> None:
if self.mouse == 'on' and self.grade < self.maxGrade:
self.grade += 1
self.changeColor(color=self.gradding_bg_seq[self.grade-1])
elif self.mouse == 'off' and self.grade > 0:
self.changeColor(color=self.gradding_bg_seq[self.grade-1])
self.grade -= 1
if self.mouse == 'on' and self.expand < self.maxExpand:
self.expand += 1
self.shadow.setColor(QtGui.QColor(self.garding_s_seq[self.expand-1]))
self.setGeometry(self.x()-1, int(self.y()-1), self.width()+2, self.height()+2)
elif self.mouse == 'off' and self.expand > 0:
self.expand -= 1
self.setGeometry(self.x()+1, int(self.y()+1), self.width()-2, self.height()-2)
elif self.mouse == 'off' and self.expand in [0, self.maxExpand] and self.grade in [0, self.maxGrade]:
self.shadow.setColor(QtGui.QColor(self.init_s_color))
self.tm.stop()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyle("Fusion")
main = Main()
main.show()
app.exec_()
@yotam5
Copy link

yotam5 commented Sep 21, 2021

this is amazing thanx

@DjonyCooper
Copy link

it`s very cool, thx u!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment