Search code examples
pythonpyqtpyqt5qpropertyanimation

pyqt animation causes object to partially disappeared


I was creating a animation in pyqt with a ball. But when I increase the speed of the animation the ball partially disappers. What can I do now? Please help!

My code:

from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QPixmap, QPainterPath
from PyQt5.QtCore import QPointF, QPropertyAnimation, pyqtProperty
import sys


class Ball(QLabel):
    def __init__(self, parent):
        super().__init__(parent)

        pix = QPixmap("ball.png")
        self.h = pix.height()
        self.w = pix.width()

        self.setPixmap(pix)

    def _set_pos(self, pos):

        self.move(pos.x() - self.w / 2, pos.y() - self.h / 2)

    pos = pyqtProperty(QPointF, fset=_set_pos)


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.ball = Ball(self)
        self.path = QPainterPath()
        self.path.moveTo(400, 30)
        self.path.lineTo(900, 30)
        self.setWindowTitle("ball animation")
        self.setGeometry(300, 300, 1000, 300)
        self.anim()

    def anim(self):
        self.anima = QPropertyAnimation(self.ball, b"pos")
        self.anima.setDuration(3000)
        self.anima.setStartValue(QPointF(30, 30))
        self.anima.setEndValue(QPointF(900, 30))
        self.anima.finished.connect(self.anim)
        self.anima.start()


app = QApplication(sys.argv)
mw = Example()
mw.show()
sys.exit(app.exec())

As I am running this I am getting something like this:

my program


Solution

  • Change a little bit size QLabel width

    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QLabel
    from PyQt5.QtGui     import QPixmap, QPainterPath
    from PyQt5.QtCore    import QPointF, QPropertyAnimation, pyqtProperty
    
    class Ball(QLabel):
        def __init__(self, parent):
            super().__init__(parent)
    
            pix = QPixmap("ball.png")
            self.h = pix.height()
            self.w = pix.width()
    
            self.resize(self.w+5, self.h)                  # <---------------
    # or 
    #        self.setContentsMargins(0, 0, 5, 0)           # <---------------
    
            self.setPixmap(pix)
    
        def _set_pos(self, pos):
    
            self.move(pos.x() - self.w / 2, pos.y() - self.h / 2)
    
        pos = pyqtProperty(QPointF, fset=_set_pos)
    
    
    class Example(QWidget):
        def __init__(self):
            super().__init__()
    
            self.ball = Ball(self)
            self.path = QPainterPath()
            self.path.moveTo(400, 30)
            self.path.lineTo(900, 30)
            self.setWindowTitle("ball animation")
            self.setGeometry(300, 300, 1000, 300)
            self.anim()
    
        def anim(self):
            self.anima = QPropertyAnimation(self.ball, b"pos")
            self.anima.setDuration(3000)
            self.anima.setStartValue(QPointF(30, 30))
            self.anima.setEndValue(QPointF(900, 30))
            self.anima.finished.connect(self.anim)
            self.anima.start()
    
    
    app = QApplication(sys.argv)
    mw = Example()
    mw.show()
    sys.exit(app.exec())
    

    ball.png

    enter image description here