如何确保 QProgressDialog 显示在 PyQt 中



有时我的QProgressDialog显示,有时它根本不显示(好像没有调用processEvents)。是否有任何 processEvents() 命令的工件可能导致 QProgressDialog 在某些情况下不显示?

我的问题是一般性的,因为我还没有能够在我的代码中隔离问题。但是,我注意到当我的QProgressDialog没有显示时,当我使用配置解析器访问文本文件时,就会发生这种情况。解决方法是在文件关闭后执行 time.sleep()(也许是为了确保该过程完成,然后 processEvents 将开始显示 QProgressDialog)。

如果有帮助,这是我将QProgressDialog作为生成器运行的代码:

def progress_dialog(self, data, label, window_title, stop_label, capture_bar=False):
    bar = QProgressDialog(label, stop_label, 0, len(data))
    if capture_bar: self.prog_bar = bar
    bar.setWindowTitle(window_title)
    for k, d in enumerate(data):
        QCoreApplication.instance().processEvents()
        if bar.wasCanceled():
            raise GeneratorExit
        # set the next value beyond the start of 0
        bar.setValue(k+1)
        # again process events to draw the new label and value
        QCoreApplication.instance().processEvents()
        yield(d)
        raise StopIteration

再次抱歉,我没有孤立问题的完整代码片段(而且完整的代码太大了)。我想我正在寻找的是检查 processEvents() 命令是否正在执行其工作的原因(因为显然我正在调用它,但它挂在其他进程上而不是显示对话框)。

编辑:

根据此支持请求,执行"bar.show()"命令将强制显示进度条。

http://redmine.smar.fi/issues/265

我将等待几周,并确保这是一个有保证的修复程序,然后再将其作为答案发布。

如果需要显示QProgessDialog而不考虑进程的持续时间,请使用其值为 0 的 setMinimumDuration 方法。根据文档,默认最小值为 4000 毫秒。

根据此支持请求,执行bar.show()命令将强制进度条显示:http://redmine.smar.fi/issues/265

只需在每次调用process events之前和首次构造进度栏之后调用 show() 方法。

我已经等了将近 4 个月,这个解决方案已经工作了,还没有失败。似乎是一个足够的答案。

这可能是一个旧线程,但我遇到了类似的问题,show() 使对话框出现,但为空。因此,我想出了这个装饰器,我将其应用于我想要运行阻塞的函数,同时允许 GUI 线程处理事件。

def nongui(fun):
    """Decorator running the function in non-gui thread while
    processing the gui events."""
    from multiprocessing.pool import ThreadPool
    from PyQt4.QtGui import QApplication
    def wrap(*args, **kwargs):
        pool = ThreadPool(processes=1)
        async = pool.apply_async(fun, args, kwargs)
        while not async.ready():
            async.wait(0.01)
            QApplication.processEvents()
        return async.get()
    return wrap

然后,使用装饰器很容易正常编写计算函数:

@nongui
def work(input):
    # Here you calculate the output and set the 
    # progress dialog value
    return out

然后像往常一样运行它:

out = work(input)

相关内容

  • 没有找到相关文章

最新更新