I made a stupid thing. But it was fun and I learned some stuff about QPropertyAnimations
along the way.
-
Here’s the code
import sys from random import randint try: from PySide import QtCore, QtGui, QtGui as QtWidgets except: from PySide2 import QtCore, QtGui, QtWidgets class DodgeButton(QtWidgets.QPushButton): def __init__(self, parent=None): super(DodgeButton, self).__init__(parent=parent) # PROPERTIES self.origSize = [self.size().width(), self.size().height()] self.aniSpeed = 120 self.aniPosition = QtCore.QPropertyAnimation(self, b"pos") self.aniPosition.setDuration(self.aniSpeed) self.aniScale = QtCore.QPropertyAnimation(self, b"size") self.aniScale.setDuration(self.aniSpeed) # EVENTS self.clicked.connect(self.win) # INIT xPos = parent.width()/2-self.width()/2 yPos = parent.height()/2-self.height()/2 self.move(xPos, yPos) def win(self): print("ALRIGHTY!") def enterEvent(self, event): self.randomScale() self.randomMove() def randomMove(self): """ move to a random position """ randX = randint(0+self.width(), self.parent().width()-self.width()) randY = randint(0+self.height(), self.parent().height()-self.height()) # Move self.aniPosition.setStartValue(self.pos()) self.aniPosition.setEndValue(QtCore.QPoint(randX, randY)) self.aniPosition.start() def randomScale(self): """ scale to random size """ randMult = float(randint(50,200))/100.0 # Scale self.aniScale.setStartValue(self.size()) newSize = scalePropo([self.origSize[0], self.origSize[1]], self.origSize[0]*randMult) sizeX = newSize[0] sizeY = newSize[1] self.aniScale.setEndValue(QtCore.QSize(sizeX, sizeY)) self.aniScale.start() class MainWindow(QtWidgets.QDialog): def __init__(self, buttonName="Analyze", parent=None): super(MainWindow, self).__init__(parent) layout = QtWidgets.QVBoxLayout() self.setLayout(layout) self.setFixedSize(500, 500) # INIT self.button = DodgeButton(self) self.button.setText(buttonName) def scalePropo(oldSize=None,newWidth=None): ''' Scales an input size proportionally to the new desired width. :param oldsize : : The current size [x,y] :param newsize : : The new desired width ''' oldWidth = float(oldSize[0]) oldHeight = float(oldSize[1]) newHeight = (oldHeight/oldWidth)*float(newWidth) newSize = [newWidth,newHeight] return newSize def setup(): app = QtWidgets.QApplication(sys.argv) win1 = MainWindow("Analyze") win2 = MainWindow("Are you sure?") win3 = MainWindow("Are you really sure?") win1.button.clicked.connect(win2.exec_) win2.button.clicked.connect(win3.exec_) win1.exec_() # app.exec_() sys.exit(0) if __name__ == '__main__': setup()