更新PyQt小部件的平滑更改

时间:2016-06-04 21:31:07

标签: python multithreading python-2.7 pyqt pyqt5

我有一个类似于This的PyQt5应用程序。现在,随着" bailar"按钮我想让网格上的角色左右看几次。我通过以下方法执行此操作:

def dance(self):
    """
    Make the P1 dance
    """
    p1 = self._objects['P1']
    x = p1.x
    y = p1.y

    cell = self.worldGrid[y][x]

    for i in xrange(3):
        print("Moving my head...")
        cell.objectLeaves('P1')
        p1.pixmap = p1.pixmap.transformed(QTransform().scale(-1, 1))
        cell.objectArrives('P1', p1)
        time.sleep(0.2)

但是,包含pixmap的标签仅在最后一次迭代时更新。我知道这必须是更新函数异步和time.sleep()阻塞主线程的问题,但我不知道如何才能显示动画。我尝试使用带有moveToThread方法的QThread,但它失败了,因为gird小部件是主窗口的子节点。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您只能看到动画的最后一帧,因为在dance功能终止之前,Qt不会更新UI。如果您在QtGui.qApp.processEvents()语句之前添加time.sleep(0.2),则会针对动画的每个帧更新UI。

请注意,在动画完成之前,用户仍无法与您的应用程序进行交互。对于像这样的短动画,这可能不是问题,但对于更长的动画,你最好使用Brendan Abel建议的QTimer或Qt动画框架。