【发布时间】: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。上面的代码。