2014-10-10 60 views
1

我有一段代碼,我在其他地方使用過,但在這種情況下,它沒有。基本上我的函數體計算了一堆東西,將結果存入一個pandas DataFrame並將其繪製到一個matplotlib畫布上。PyQt:QProgressDialog顯示但是爲空(顯示背景內容)

我把下面的代碼放在函數體的頂部,希望它在函數調用期間顯示一個對話框。但是,所發生的一切都是出現對話框,其中框內容反映了屏幕後立即顯示的內容。這將在函數調用期間保留在屏幕上,然後在完成運行時正確關閉。

任何想法出了什麼問題?

萬一它有用,父母(self)是QWidget

噢,還有一件事,如果我刪除了progress.cancel()行,一旦該函數的主要部分完成執行,QProgressDialog實際上會使用進度欄和標籤文本('Updating ...')自己繪製自己。

非常感謝您的幫助!

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

#calculate and plot DataFrame 

progress.cancel() 
+1

你可以嘗試app.processEvents (),其中app是QApplication實例,在進入計算之前。 – mdurant 2014-10-10 15:54:59

+0

感謝您的回覆!有沒有一種簡單的方法可以從我的課程中訪問應用程序實例? – Ben 2014-10-10 17:22:33

+2

'QtGui.QApplication.instance()' – mdurant 2014-10-10 17:24:41

回答

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) 
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 
+0

再讀一遍之後,無論何時調用setValue(),processEvents()也會被調用。當調用setValue(max)時,對話完成並退出。 progress.done()實際上並不需要。 – cmoman 2015-12-16 22:05:39