PyQt - 在其他函数运行时显示GIF

时间:2016-06-23 05:16:08

标签: python pyqt pyqt4 pyside

我有一个将数据保存到文件的应用程序,有时保存功能需要很长时间,因为我的文件很大。我想要一个" loading.gif"在保存文件时显示,但尚未知道如何执行此操作。这是我的代码:

def saveBook(self):
    self.loadingWidget.setHidden(not root.journal.status.loading.isHidden())
    app.processEvents()
    self.excelSheet.save(filename = self.file)
    self.loadingWidget.setHidden(not root.journal.status.loading.isHidden())

LoadingWidget是持有GIF的QLabel(自动打开)。

  • 第一行打开了
  • 上GIF的可见性
  • 第二行立即处理/显示GIF
  • 第三个运行保存功能(无论多长时间)
  • 第四行将GIF关闭。

显示GIF,但已暂停。如果我省略了第四行,GIF将在保存功能完成后播放,但是当保存功能正在运行时,我无法使GIF播放。我该怎么做呢?

编辑:建议的重复不正确。那个人试图在标签旁边显示gif。我试图让GIF帧播放而另一个函数save运行。 GIF已经可见,但应用程序在当前save功能完成后才会处理其播放。

更新 - 解决方案:

def saveBook(self):
    #Show GIF
    root.saved.gif.on()
    #Update frame
    GLOB.app.processEvents()
    #Save on separate thread to allow interface to remain active
    t = threading.Thread(target=self.saveThread)
    t.start()

def saveThread(self): #this function runs in background, allowing GIF to run in main thread
    #Prevent multiple threads from queueing to save the file
    if not self.lock.acquire(False):
        return
    self.b.save(self.file)
    #Remove GIF
    root.saved.gif.off()
    self.lock.release()

1 个答案:

答案 0 :(得分:1)

当QT处理主事件循环中的其他代码时,GUI不会更新。通常,如果您有长时间运行的进程而不想阻止GUI,则可以将这些操作推送到单独的线程中。