2016-01-05 101 views
0

我想在函数完成之前显示加载gif。当函数执行时QtGui.QMovie gif停止

我的代码是

self.LoadingGif = QtGui.QLabel(MainWindow) 
movie = QtGui.QMovie("hashUpdate.gif") 
self.LoadingGif.setMovie(movie) 
self.LoadingGif.setAlignment(QtCore.Qt.AlignCenter) 
self.gridLayout_2.addWidget(self.LoadingGif, 4, 1, 1, 1) 
movie.start() 
self.MYFUNCTION() 

的问题是,GIF节目,但它是不是在玩。它只在功能完成时开始播放。
如何在函数执行过程中使GIF播放?

回答

5

GIF停止播放,因为您的功能self.MYFUNCTION阻止了Qt事件循环。 Event循环是Qt的一部分,它处理鼠标/键盘事件,处理小部件的重绘(当你将鼠标悬停在它们上面或点击它们时,就像按钮一样),并更新播放动画时显示的当前帧。

所以Qt事件循环负责执行你的代码以响应你的程序中发生的各种事情,但是当它执行你的代码时,它不能做任何事情。

所以你需要改变你的代码。有几种解决方案,以这样的:在辅助线程

  • 运行MYFUNCTION所以它不会阻止Qt的事件循环。但是,如果您的函数以任何方式与Qt GUI进行交互,则这是而不是选项。如果您在MYFUNCTION(如更新标签或其他)中调用任何Qt GUI方法,则绝不能从辅助线程完成(如果您尝试,程序将随机崩溃)。建议使用带有Qt的QThread而不是Python线程,但如果您不需要从函数返回主线程,则Python线程将正常工作。

  • 如果MYFUNCTION运行很长一段时间,因为你有一个for/while循环,你可以考虑使用一个QTimer定期调用循环中的代码。在执行QTimer之后,控制权会返回到Qt事件循环,因此它可以在循环迭代之间处理其他事情(如更新动画)。

  • 在您的功能期间定期拨打QApplication.instance().processEvents()。这也会将控制权返回给Qt事件循环,但如果您的函数也在使用Qt进行操作,您可能会收到意外的行为。

1

您需要将self.your_function移动到另一个thread,让Qt更新GUI和您的GIF!