PyQt:QProgressDialog显示但是为空(显示背景内容)

时间:2014-10-10 15:49:40

标签: python matplotlib pyqt pyqt4

我有一段我在其他地方使用的代码(它完全符合我的要求),但在这种情况下却没有。基本上我的函数体计算了一堆东西,将结果整理成一个pandas DataFrame并将其绘制到matplotlib画布上。

我将下面的代码放在函数体的顶部,希望它在函数调用期间显示一个对话框。但是,所有发生的事情都会出现一个对话框,其中的框内容反映了屏幕后面的内容。在函数调用期间,它将保留在屏幕上,然后在运行完毕后正确关闭。

任何想法出了什么问题?

如果它有用,则父({{​​1}})为self

哦,还有一件事,如果我删除了QWidget行,一旦函数的主要部分执行完毕,progress.cancel()实际上会使用进度条和标签文本(# 39;更新...'。)

非常感谢你的帮助!

QProgressDialog

2 个答案:

答案 0 :(得分:0)

我发现自己在某些时候遇到了同样的问题,并提出了我应用于我想要运行阻塞的函数的装饰器,同时允许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)

答案 1 :(得分:0)

progress = QProgressDialog( parent = self )
progress.setCancelButton( None )
progress.setLabelText( 'Updating...' )
progress.setMinimum( 0 )
progress.setMaximum( 10 )
progress.forceShow()

progress.setValue(0)

#calculate and plot DataFrame
domystuff(progress) # pass progress to your function so you can continue to increment progress

qApp.processEvents() # qApp is a reference to QApplication instance, available within QtGui module. Can use this whereever you are in your code, including lines in your domystuff() function.


progress.setValue(10) # progress bar moves to 100% (based on our maximum of 10 above)



progress.done() # I don't think you want to cancel. This is inherited from QDialog