【问题标题】:PyQt - Displaying GIF While Other Function RunsPyQt - 在其他功能运行时显示 GIF
【发布时间】:2016-10-25 06:30:55
【问题描述】:

我有一个将数据保存到文件的应用程序,由于我的文件很大,有时保存功能需要很长时间。我想在保存文件时显示“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。我正在尝试在另一个函数save 运行时播放 GIF 帧。 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()

【问题讨论】:

  • 这根本不是重复的。那个人试图在标签旁边显示 gif。我正在尝试在另一个功能运行时播放 GIF 帧。 GIF 已经可见,但应用程序不会处理它正在播放的内容,直到当前功能完成之后
  • 同样的问题,只有将gif放在QMovie中,然后设置在QLabel上,才会播放。
  • 该 gif 已经QMovie 内,并连接到 QLabel。第 1 行使 GIF 出现,但它被暂停。如果我删除第 4 行(隐藏 GIF),则 GIF 将播放,但只有 saveBook 函数完成。这是我的 GIF 在我第一次出现时运行的问题,而不是在函数完成后运行。
  • @dliv 是的,我是。在app.processEvents() 之后,我创建了一个指向保存函数的线程。保存功能完成后,它会关闭 GIF。上面的代码。

标签: python pyqt pyqt4 pyside


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多