我有一个类似于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小部件是主窗口的子节点。有什么想法吗?
答案 0 :(得分:0)
您只能看到动画的最后一帧,因为在dance
功能终止之前,Qt不会更新UI。如果您在QtGui.qApp.processEvents()
语句之前添加time.sleep(0.2)
,则会针对动画的每个帧更新UI。
请注意,在动画完成之前,用户仍无法与您的应用程序进行交互。对于像这样的短动画,这可能不是问题,但对于更长的动画,你最好使用Brendan Abel建议的QTimer
或Qt动画框架。