PyQt5執行耗時操作導致主頁面暫時性卡死問題

2022-04-02 11:41:27 字數 1510 閱讀 2212

問題: pyqt5主介面,如果某些操作比較耗時,比如點選按鈕執行某個指令碼、點選按鈕從網路上讀取資料等,則點選按鈕後,很可能造成整個主視窗卡死,無法執行視窗最大化、最小化、文字輸入、按鈕點選等其他操作。

例子如下:

程式執行後,有個按鈕和乙個qlabel顯示框,點選按鈕後,會計算1+2+...+50000000,整個計算需要十幾秒,計算過程中,主介面卡死,無法執行視窗最大化等操作。

截圖1是程式執行完的情況,主視窗顯示了乙個按鈕個乙個qlabel; 截圖2是點選按鈕執行累加操作的情況,此時主頁面卡死,

視窗無法最大化、最小化等; 截圖3是加法操作執行完的情況,此時介面恢復正常。

推測原因: 在pyqt中,gui介面本身就是乙個主線程,當點選按鈕執行累加操作時,因為這個累加操作直接跑在這個主線程上,gui需要等待累加操作完成後才會響應,在等待這段時間,整個gui就處於卡死的狀態。如果這個操作是乙個死迴圈(比如按秒更新時間),在windows下,系統會認為這個程式執行出錯了,會自動顯示未響應,進而關閉程式。這裡可以考慮另開乙個執行緒來執行這個累加操作。(pyqt5的qthread)

截圖1就是程式執行完成後的效果;截圖2就是按鈕點選後的效果(新加了個點選按鈕後更新按鈕文字和將按鈕設定為不可點選),

此時主頁面可以正常拖動、最大、最小化;截圖三累加操作執行完成後的效果(滑鼠放在按鈕會變色,此時滑鼠是放在按鈕上的)

另寫了乙個qthread,按秒更新時間

截圖中看不到效果,實際效果是每秒都會更新時間,這種迴圈更新的還可以使用qtimer來處理。

總結:

1. 比較耗時的任務最好使用新執行緒去處理(qthread),主線程僅僅用於gui顯示

2. 迴圈任務可以使用新執行緒去處理,也可以使用qtimer去處理(這裡沒有演示qtimer)

3. 新執行緒要建立了才能正常使用。可以按鈕觸發建立,可以在初始化頁面的時候就建立

PyQt5 小操作記錄 ( )

本人pyqt5渣渣一枚,採用pyqt5來實現一些小的演算法介面。我使用的參考書為 pyqt5快速開發與實戰 本書對於入門pyqt5有很大的幫助,但由於篇幅有限,並沒有做進一步的深入介紹。qt designer是個好工具,可以通過拖動部件來實現介面的布局,但由於最後還需要進一步的程式設計調整,個人最近...

PyQt5 小操作記錄( )

使用pyqt5可以很方便的編寫乙個應用介面,但重在如何美化軟體介面 本人只會簡單的一丟丟操作 下面就簡單記錄一些小操作和方法。如圖,上面是乙個簡單的按鈕操作介面,當然其功能實現是另一部分內容,在這一部分中,只討論介面美化的部分。上面的介面是四個按鈕,在這裡,我們將第乙個按鈕作為題目顯示,其它三個按鈕...

PyQt5 系統剪貼簿操作

近期做畢業設計,用的pyqt5做乙個windows軟體。有一部分需要對檔案或者資料夾進行,複製與貼上操作,查了好久,終於找到了方法 data qmimedata url qurl.fromlocalfile file path data.seturls url clipboard.setmimeda...