PyQt 小部件的平滑更新更改
Update changes smoothly of a PyQt widget
我有一个看起来像这样的 PyQt5 应用程序 This。现在,使用 "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() 阻塞主线程的问题,但我不知道我还能如何显示动画。我尝试将 QThread 与 moveToThread 方法一起使用,但它失败了,因为 gird 小部件是主要 window 的子项。有什么想法吗?
您只能看到动画的最后一帧,因为 UI 在 dance
函数终止之前不会被 Qt 更新。如果您在 time.sleep(0.2)
语句之前添加 QtGui.qApp.processEvents()
,则动画的每一帧都会更新 UI。
请注意,在动画完成之前,用户仍然无法与您的应用程序交互。对于像这样的短动画,这可能不是问题,但对于较长的动画,您最好使用 QTimer
或 Brendan Abel 建议的 Qt 动画框架。
我有一个看起来像这样的 PyQt5 应用程序 This。现在,使用 "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() 阻塞主线程的问题,但我不知道我还能如何显示动画。我尝试将 QThread 与 moveToThread 方法一起使用,但它失败了,因为 gird 小部件是主要 window 的子项。有什么想法吗?
您只能看到动画的最后一帧,因为 UI 在 dance
函数终止之前不会被 Qt 更新。如果您在 time.sleep(0.2)
语句之前添加 QtGui.qApp.processEvents()
,则动画的每一帧都会更新 UI。
请注意,在动画完成之前,用户仍然无法与您的应用程序交互。对于像这样的短动画,这可能不是问题,但对于较长的动画,您最好使用 QTimer
或 Brendan Abel 建议的 Qt 动画框架。