Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QtGui.QMovie gif在函数执行时停止_Python_Pyqt - Fatal编程技术网

Python QtGui.QMovie 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,

我想显示正在加载的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?

您需要将
self.您的函数
移动到另一个函数,让Qt更新GUI,从而更新gif

您需要将self.u函数移动到另一个函数,让Qt更新GUI和GIF

GIF停止播放,因为您的函数
self.MYFUNCTION
正在阻止Qt事件循环。事件循环是Qt的一部分,它(除其他外)处理鼠标/键盘事件,处理小部件的重绘(例如,当您将鼠标悬停在小部件上或单击它们时的按钮),以及在播放动画时更新显示的当前帧

因此,Qt事件循环负责执行代码以响应程序中发生的各种事情,但在执行代码时,它不能做任何其他事情

所以你需要改变你的代码。有几种解决方案:

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

  • <> > <代码> MyStudio长时间运行,因为 < <代码> > 循环,您可以考虑使用<代码> qTime<代码>来周期性地调用循环中的代码。控件在执行
    QTimer
    后返回到Qt事件循环,以便在循环迭代之间处理其他事情(如更新动画)

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


    • GIF停止播放,因为您的函数
      self.MYFUNCTION
      正在阻止Qt事件循环。事件循环是Qt的一部分,它(除其他外)处理鼠标/键盘事件,处理小部件的重绘(例如,当您将鼠标悬停在小部件上或单击它们时的按钮),以及在播放动画时更新显示的当前帧

      因此,Qt事件循环负责执行代码以响应程序中发生的各种事情,但在执行代码时,它不能做任何其他事情

      所以你需要改变你的代码。有几种解决方案:

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

      • <> > <代码> MyStudio长时间运行,因为 < <代码> > 循环,您可以考虑使用<代码> qTime<代码>来周期性地调用循环中的代码。控件在执行
        QTimer
        后返回到Qt事件循环,以便在循环迭代之间处理其他事情(如更新动画)

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