我有一个将数据保存到文件的应用程序,有时保存功能需要很长时间,因为我的文件很大。我想要一个" 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帧播放而另一个函数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()
答案 0 :(得分:1)
当QT处理主事件循环中的其他代码时,GUI不会更新。通常,如果您有长时间运行的进程而不想阻止GUI,则可以将这些操作推送到单独的线程中。