getOpenFileNam上的进度条

2024-05-08 13:05:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的应用程序中,我有下面一行打开一个文件对话框窗口。一旦我得到了文件名,我会进行一系列的处理,这需要相当长的时间,一旦完成了,工作区就为用户准备好了。你知道吗

filename, _ = QtGui.QFileDialog.getOpenFileName(self, 'Open file', os.curdir, "*.cws")

文件对话框是一个模式窗口(默认情况下),这很好,因为它可以防止用户在工作区还没有准备好使用的时候做一些愚蠢的事情。我想在某个地方放一个进度条,让你知道要处理多少。我制作了另一个对话框窗口,其中显示一个进度条和一些其他信息。你知道吗

现在,由于文件对话框窗口是模态的,它只是在我的工作区处理时冻结在那里,而进度对话框只有在所有事情完成后才会弹出。你知道吗

我已经研究过将文件对话框窗口设置为非模态,但我认为这是不可能的。我在想,也许可以强迫它关闭,并立即有我的进度对话框窗口弹出,接管模态。如何以编程方式关闭“文件”对话框窗口?我不知道怎样才能得到这份表格的证明。你知道吗

或者你对如何解决这个问题有更好的建议?你知道吗


Tags: 文件进度条用户self应用程序文件名时间filename
1条回答
网友
1楼 · 发布于 2024-05-08 13:05:55

正如thuga提到的,应用程序事件循环被繁重的处理卡住了。 因此,当处理正在运行时,不会处理事件(尤其是绘制事件),从而导致GUI冻结。你知道吗

在我看来,你有两个选择:

强制处理事件(不是很经典,但可能有用):

这取决于你的“繁重处理”是如何完成的。 假设挂起循环的代码是“在您的手中”(而不是在第三方lib中)。 您可以在QApplication.processEvents中添加尽可能多的调用。你知道吗

如果处理是基于循环的,则可以如下所示:

for item in itemList:
    ...processitem...
    QtGui.QApplication.processEvents()

这是在不应该知道的部分代码中向GUI添加依赖项的主要缺点。 如果您的代码不是基于循环的,那么您必须添加几个对processEvents的调用,这些调用会污染处理代码。你知道吗

停止挂起事件循环(更复杂但更易于维护)

这意味着您必须按照thuga的建议处理线程和/或子进程。 这个解决方案假设GUI代码和业务代码能够很好地分离。你知道吗

你可以看看this article from Qt Quarterly,它在这个问题上给出了一些亮点。 由于python全局解释器锁(GIL)的存在,在线程中可能看不到更好的结果。 考虑使用multiprocessing库。你知道吗

相关问题 更多 >

    热门问题