我有一段我在其他地方使用的代码(它完全符合我的要求),但在这种情况下却没有。基本上我的函数体计算了一堆东西,将结果整理成一个pandas DataFrame并将其绘制到matplotlib画布上。
我将下面的代码放在函数体的顶部,希望它在函数调用期间显示一个对话框。但是,所有发生的事情都会出现一个对话框,其中的框内容反映了屏幕后面的内容。在函数调用期间,它将保留在屏幕上,然后在运行完毕后正确关闭。
任何想法出了什么问题?
如果它有用,则父({{1}})为self
。
哦,还有一件事,如果我删除了QWidget
行,一旦函数的主要部分执行完毕,progress.cancel()
实际上会使用进度条和标签文本(# 39;更新...'。)
非常感谢你的帮助!
QProgressDialog
答案 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