【问题标题】:Update changes smoothly of a PyQt widget平滑更新 PyQt 小部件的更改
【发布时间】:2016-10-04 17:59:13
【问题描述】:

我有一个看起来像 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)

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

【问题讨论】:

标签: python multithreading python-2.7 pyqt pyqt5


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多