我在GUI編程方面經驗不多,但我正在用PyQt編寫一個GUI應用程序。有了這個應用程序,用戶可以打開一個二進制文件並使用它進行一些編輯。pyqt:在文件打開對話框中的長進程
打開文件時,我會做一些需要一段時間(〜15s)的處理。因此,當用戶選擇文件並在文件打開對話框中按下「打開」按鈕時,GUI將被凍結。什麼是獲得更好用戶體驗的最佳方式?
感謝
我在GUI編程方面經驗不多,但我正在用PyQt編寫一個GUI應用程序。有了這個應用程序,用戶可以打開一個二進制文件並使用它進行一些編輯。pyqt:在文件打開對話框中的長進程
打開文件時,我會做一些需要一段時間(〜15s)的處理。因此,當用戶選擇文件並在文件打開對話框中按下「打開」按鈕時,GUI將被凍結。什麼是獲得更好用戶體驗的最佳方式?
感謝
在後臺加載顯示狀態欄中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
是否使用QThread
或trheading.Thread
討論here
編輯的問題(根據@Nathan的提示): 在parent
上,定時器函數應該檢查每100ms,self.parent.progress的值並相應地設置進度條。這樣,進度條就從GUI的主線程中設置。
您正在尋找一些方法來完成這項工作在不同的線程的GUI主循環的。
你可以檢查here開始
主要GUI框架爲wxPython的和PyQt的具有運行長不結冰的GUI運行的應用程序的方法。我個人更喜歡直接使用python線程模塊
您需要定期要求應用程序處理事件隊列中未決的事件。您可以通過調用QApplication實例的processEvents()方法來完成此操作。如果你可以通過調用processEvents(),GUI和進度條來散佈你的計算,它們會自我更新。請注意,這是而不是與使GUI響應相同。
爲了使GUI作出響應,同時執行您的負載,則需要加載操作分成後臺線程。您不能從後臺線程中執行GUI操作,但在後臺線程可發射跨越線程邊界信號。在多線程PyQt編程上使用Here is an article。
注意parent.update_progressbar(ⅰ)應發出用於更新進度條的信號和_not_直接修改進度條。只能從主線程控制Qt GUI元素。 – Nathan
@Nathan:好點,相應地調整答案。 – Remi