pyqt:文件打开对话框中的长进程

时间:2011-09-30 18:57:37

标签: python qt pyqt4

我在GUI编程方面经验不多,但我正在用PyQt编写GUI应用程序。使用此应用程序,用户可以打开二进制文件并使用它进行一些编辑。

当文件打开时,我会做一些需要一段时间(约15秒)的处理。因此,当用户选择文件并按文件打开对话框中的“打开”按钮时,GUI将被冻结。什么是实现更好用户体验的最佳方式?

由于

3 个答案:

答案 0 :(得分:2)

在背景中加载,通过状态栏中的Gauge显示进度。

为此,您可以使用QThread启动加载。您的线程类可以如下所示(假设parent将具有属性progress):

QtFileLoader(QtCore.QThread):
    def __init__(self,parent=None, filepath=None):
        QtCore.QThread.__init__(self,parent)
        self.data = None
        self.filepath = filepath

    def run(self):
        """ load data in parts and update the progess par """
        chunksize = 1000
        filesize = ... # TODO: get length of file
        n_parts = int(filesize/chunksize) + 1
        with open(self.filepath, 'rb') as f:
            for i in range(n_parts):
                self.data += f.read(chunksize)
                self.parent.progress = i 

讨论是否使用QThreadtrheading.Thread的问题here

编辑(根据@Nathan的提示): 在parent上,计时器功能应该检查每个100毫秒self.parent.progress的值并相应地设置进度条。这样,进度条就可以在GUI的主线程中设置。

答案 1 :(得分:2)

您需要定期要求应用程序处理事件队列中待处理的事件。您可以通过调用QApplication实例的processEvents()方法来执行此操作。如果您可以通过调用processEvents(),GUI和进度条来散布您的计算,那么它们将自行更新。请注意,这与与使GUI响应相同。

要在执行加载时使GUI响应,您需要将加载操作拆分为后台线程。虽然后台线程可以发出跨越线程边界的信号,但您无法从后台线程执行GUI操作。关于多线程PyQt编程的Here is an article

答案 2 :(得分:1)

您正在寻找一些方法来在与GUI主循环不同的线程中完成工作 您可以查看here开始

作为wxpython和pyQt的主要gui框架具有运行长时间运行的应用程序而不冻结gui的方法。我个人更喜欢直接使用python线程模块