2011-09-30 49 views
0

我在GUI編程方面經驗不多,但我正在用PyQt編寫一個GUI應用程序。有了這個應用程序,用戶可以打開一個二進制文件並使用它進行一些編輯。pyqt:在文件打開對話框中的長進程

打開文件時,我會做一些需要一段時間(〜15s)的處理。因此,當用戶選擇文件並在文件打開對話框中按下「打開」按鈕時,GUI將被凍結。什麼是獲得更好用戶體驗的最佳方式?

感謝

回答

2

在後臺加載顯示狀態欄中Gauge的進度。

爲此,您可以使用QThread啓動加載。你的線程類可以看看如下(假設parent將有一個屬性progress):

QtFileLoader(QtCore.QThread): 
    def __init__(self,parent=None, filepath=None): 
     QtCore.QThread.__init__(self,parent) 
     self.data = None 
     self.filepath = filepath 

    def run(self): 
     """ load data in parts and update the progess par """ 
     chunksize = 1000 
     filesize = ... # TODO: get length of file 
     n_parts = int(filesize/chunksize) + 1 
     with open(self.filepath, 'rb') as f: 
      for i in range(n_parts): 
       self.data += f.read(chunksize) 
       self.parent.progress = i 

是否使用QThreadtrheading.Thread討論here

編輯的問題(根據@Nathan的提示): 在parent上,定時器函數應該檢查每100ms,self.parent.progress的值並相應地設置進度條。這樣,進度條就從GUI的主線程中設置。

+0

注意parent.update_progressbar(ⅰ)應發出用於更新進度條的信號和_not_直接修改進度條。只能從主線程控制Qt GUI元素。 – Nathan

+0

@Nathan:好點,相應地調整答案。 – Remi

1

您正在尋找一些方法來完成這項工作在不同的線程的GUI主循環的。
你可以檢查here開始

主要GUI框架爲wxPython的和PyQt的具有運行長不結冰的GUI運行的應用程序的方法。我個人更喜歡直接使用python線程模塊

2

您需要定期要求應用程序處理事件隊列中未決的事件。您可以通過調用QApplication實例的processEvents()方法來完成此操作。如果你可以通過調用processEvents(),GUI和進度條來散佈你的計算,它們會自我更新。請注意,這是而不是與使GUI響應相同。

爲了使GUI作出響應,同時執行您的負載,則需要加載操作分成後臺線程。您不能從後臺線程中執行GUI操作,但在後臺線程可發射跨越線程邊界信號。在多線程PyQt編程上使用Here is an article