2013-11-04 60 views
2

有時我的QProgressDialog顯示,有時它根本不顯示(就好像processEvents沒有被調用)。是否有processEvents()命令的任何工件可能導致QProgressDialog在某些情況下不顯示?如何確保QProgressDialog顯示在PyQt

我的問題是一般的,因爲我還沒有能夠隔離我的代碼中的問題。但是,我注意到,當我使用配置解析器訪問文本文件時,我的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

我要等幾個星期,並確保這是張貼作爲一個答案之前保證修補程序。

回答

1

根據這一支持請求做bar.show()命令將強制進度條顯示: http://redmine.smar.fi/issues/265

process events調用之前和進度條首先建成後只需調用show()方法。

我已經等了將近4個月,這個解決方案還沒有失敗呢。似乎是一個足夠的答案。

2

如果您需要顯示QProgessDialog而不考慮過程的持續時間,請使用其值爲0的setMinimumDuration方法。根據文檔,缺省最小值爲4000毫秒。

+0

不幸的是這並沒有解決我的具體問題。仍然給予+1感謝您的幫助。 – ecoe

1

這可能是一箇舊的線程,但我有一個類似的問題,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) 
相關問題