Python - 用 PyQt5 寫桌面程式 在 Mac
Python - 用 PyQt5 寫桌面程式 在 Mac
用 Python的 tkinter寫了一套簡單的GUI,但由於畫面過於簡陋。選用框架,直接挑功能最強、社群支援最廣的Qt來進行開發。
News from: TNLIN

開發環境:Mac OSX 10.12.3
語言版本:Python 3.5.0
其他版本:Qt Creator 4.2.1, Based on Qt 5.8
常見有三種解決方式 (https://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt),而我採用這篇文章 (http://project.mde.tw/blog/40323230ri-zhi-1050907.html)的解決方法。
最後附上新舊版程式對照圖

用 Python的 tkinter寫了一套簡單的GUI,但由於畫面過於簡陋。選用框架,直接挑功能最強、社群支援最廣的Qt來進行開發。
News from: TNLIN

開發環境:Mac OSX 10.12.3
語言版本:Python 3.5.0
其他版本:Qt Creator 4.2.1, Based on Qt 5.8
一、下載Qt Creator
到官網下載 (https://www.qt.io/download),簡單填寫一些問題後即可根據下載自己需要的Qt Creator版本
在安裝的時候我選擇了目前最新的Qt 5.8,並且勾選自己需要開發的UI環境(不然預設會全部都裝,約20GB),像我就只有選擇桌面程式開發,整體加起來大約1.4GB
二、安裝pyqt5
在console內輸入 pip install pyqt5,即可安裝python開發所需要的套件
建議不要使用brew來安裝pyqt5,它會順便幫你把python升級到3.6
可是目前有一些套件對python 3.6仍然不支援,會出事情的。
建議不要使用brew來安裝pyqt5,它會順便幫你把python升級到3.6
可是目前有一些套件對python 3.6仍然不支援,會出事情的。
三、使用Qt Creator設計UI
讓大家稍微認識一下Qt Creator長什麼樣子,跟Microsoft Visual Studio很像.
這套工具最厲害的地方在於,在可視化視窗上將GUI設計完成後
透過以下指令即可把.ui檔輸出成.py檔
透過以下指令即可把.ui檔輸出成.py檔
pyuic5 mainwindow.ui -o pyqtwindow.py
之後再內將此檔案import到程式內,即可完成GUI的初始化,範例如下:
一個開發的小訣竅:如果不知道如何用python調用各個component的話。先在Qt Creator上修改成你想要的樣子,再去觀察輸出的.py檔是如何實現的。直接看範例依樣化葫蘆最快了。
四、如何在pyqt5上使用concurrent.futures做multithreading?
這個程式其中一項功能是上傳,傳送速度要快之外還必須要有進度條 concurrent.futures 是Python3新的一個高階做平行運算的Interface。
原本在tkinter上我是透過在GUI thread A上開一條thread B來管理ThreadPoolExecutor。
但這個作法在PyQT上行不通,thread B在執行時會導致GUI的凍結(freezing)。
在上傳工作結束前,整個畫面都會轉小彩球/漏斗,進度條也就失去意義了。
在研究之後發現:必須使用QThread來與GUI thread進行溝通。
但這個作法在PyQT上行不通,thread B在執行時會導致GUI的凍結(freezing)。
在上傳工作結束前,整個畫面都會轉小彩球/漏斗,進度條也就失去意義了。
在研究之後發現:必須使用QThread來與GUI thread進行溝通。
常見有三種解決方式 (https://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt),而我採用這篇文章 (http://project.mde.tw/blog/40323230ri-zhi-1050907.html)的解決方法。
主要做了幾件事情,分別如下
- 繼承QThread並且創建一個Worker
- 在GUI Thread呼叫此Worker,讓他來管理ThreadPoolExecutor
- 在GUI Thread內用pyqtSlot來註冊進度條更新的event
- 在Worker 透過pyqtSignal來與GUI Thread溝通,更新進度條
最後附上新舊版程式對照圖







macOS 主UI窗口最小化之後QThread執行會變慢
回覆刪除