是什么导致" QTimeLine已经运行" PySide中的消息?

时间:2014-03-31 02:43:21

标签: python qt pyqt pyside

正如问题中所述,当我尝试使用QGraphicsItemAnimation的setPosAt()函数简单地为圆圈设置动画时,我在终端中收到此警告消息,我对这个警告的起源感到非常困惑。我的代码:

def animate(self):

    # moves item to location smoothly in one second
    def animate_to(t,item,x,y):
        # used to animate an item in specific ways
        animation = QtGui.QGraphicsItemAnimation()

        # create a timeline (1 sec here)
        timeline = QtCore.QTimeLine(1000)
        timeline.setFrameRange(0,100)   # 100 steps

        #item should at 'x,y' by time 't'
        animation.setPosAt(t,QtCore.QPointF(x,y))
        animation.setItem(item)             # animate this item
        animation.setTimeLine(timeline)     # with this duration/steps

        return animation

    self.animations.append(animate_to(1,self.c1,150,150))

    [ animation.timeLine().start() for animation in self.animations ]

    self.animator.start(1000)

最让我感到困惑的是,当我在上一节中注释掉最后一行时,这个警告就会消失 - 我的理解与QTimer有关,而不是QTimeLine本身。作为参考,这里是处理QTimer的唯一其他代码:

class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
    super(MainWindow, self).__init__(parent)
    self.setupUi(self)

          ...

    self.animator = QtCore.QTimer()
    self.animator.timeout.connect(self.animate)

    self.animate()

有关此警告的来源或任何可能的修复的任何想法?

1 个答案:

答案 0 :(得分:1)

你的代码缩进有点偏差(顶行应该是非缩进的?),所以我会用文字总结你的代码,以确认我理解发生了什么。

您致电self.animate()。此方法创建动画,并将其附加到列表self.animations。您遍历此列表并启动动画。你启动一个定时器(暂停1秒),调用self.animate()

问题出现是因为self.animations每次调用self.animate()时都会增加一个元素。因此,下次调用该方法时,旧的动画实例仍然在列表中。您正在遍历整个列表以启动动画,因此您在动画上多次调用animator.timeLine().start()

删除对计时器的调用会阻止self.animation()方法多次运行,因此当您注释掉该行时,您不会遇到问题。