Python QtGui.QMovie gif在函数执行时停止
我想显示正在加载的gif,直到函数完成 我的密码是Python QtGui.QMovie gif在函数执行时停止,python,pyqt,Python,Pyqt,我想显示正在加载的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,
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?您需要将
self.您的函数
移动到另一个函数,让Qt更新GUI,从而更新gif 您需要将self.u函数移动到另一个函数,让Qt更新GUI和GIF GIF停止播放,因为您的函数self.MYFUNCTION
正在阻止Qt事件循环。事件循环是Qt的一部分,它(除其他外)处理鼠标/键盘事件,处理小部件的重绘(例如,当您将鼠标悬停在小部件上或单击它们时的按钮),以及在播放动画时更新显示的当前帧
因此,Qt事件循环负责执行代码以响应程序中发生的各种事情,但在执行代码时,它不能做任何其他事情
所以你需要改变你的代码。有几种解决方案:
- 在辅助线程中运行
,这样它就不会阻塞Qt事件循环。但是,如果您的函数以任何方式与Qt GUI交互,则这不是一个选项。如果在MYFUNCTION
中调用任何Qt GUI方法(如更新标签或其他),则决不能从辅助线程执行此操作(如果尝试,程序将随机崩溃)。建议在Qt中使用MYFUNCTION
,而不是使用Python线程,但是如果不需要从函数返回到主线程,则Python线程可以正常工作QThread
<> > <代码> MyStudio长时间运行,因为 < <代码> > 循环,您可以考虑使用<代码> qTime<代码>来周期性地调用循环中的代码。控件在执行
QTimer
后返回到Qt事件循环,以便在循环迭代之间处理其他事情(如更新动画)
QApplication.instance().processEvents()
。这也会将控制权返回到Qt事件循环,但如果您的函数也在使用Qt执行操作,则可能会出现意外行为- GIF停止播放,因为您的函数
self.MYFUNCTION
正在阻止Qt事件循环。事件循环是Qt的一部分,它(除其他外)处理鼠标/键盘事件,处理小部件的重绘(例如,当您将鼠标悬停在小部件上或单击它们时的按钮),以及在播放动画时更新显示的当前帧
因此,Qt事件循环负责执行代码以响应程序中发生的各种事情,但在执行代码时,它不能做任何其他事情
所以你需要改变你的代码。有几种解决方案:
- 在辅助线程中运行
,这样它就不会阻塞Qt事件循环。但是,如果您的函数以任何方式与Qt GUI交互,则这不是一个选项。如果在MYFUNCTION
中调用任何Qt GUI方法(如更新标签或其他),则决不能从辅助线程执行此操作(如果尝试,程序将随机崩溃)。建议在Qt中使用MYFUNCTION
,而不是使用Python线程,但是如果不需要从函数返回到主线程,则Python线程可以正常工作QThread
<> > <代码> MyStudio长时间运行,因为 < <代码> > 循环,您可以考虑使用<代码> qTime<代码>来周期性地调用循环中的代码。控件在执行
QTimer
后返回到Qt事件循环,以便在循环迭代之间处理其他事情(如更新动画)
QApplication.instance().processEvents()
。这也会将控制权返回到Qt事件循环,但如果您的函数也在使用Qt执行操作,则可能会出现意外行为