pyqt动画导致对象部分消失
pyqt animation causes object to partially disappeared
我在 pyqt 中用一个球创建了一个动画。但是当我提高动画的速度时,球会部分消失。
我现在能做什么?请帮忙!
我的代码:
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())
因为我是 运行 我得到这样的东西:
稍微改变QLabel的宽度
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
我在 pyqt 中用一个球创建了一个动画。但是当我提高动画的速度时,球会部分消失。 我现在能做什么?请帮忙!
我的代码:
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())
因为我是 运行 我得到这样的东西:
稍微改变QLabel的宽度
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