blavince's BLOG

Giving is a reward in itself.

0%

VScode + Python3.7 + PySide2

因為團隊內部調試時使用 GUI (圖形使用者介面 Graphical User Interface,縮寫:GUI) 小工具會比手動輸入 command 更有效率且較不易出錯, 同時考量儀控需求及網路上有許多 Python 的資源可參考. 站在巨人的肩上讓開發事半功倍.

前言

學習開發 Python 有多種途徑, 亦有多種 IDE 可以選擇, 我最早期曾用 Anaconda 安裝整個環境, 不只是 Jupyter notebook 我也有下載過 Pycharm , 都是很好的起手式, 但是都試過之後個人偏好微軟的輕量化 Visual studio code, 不只介面設計的很好看又簡潔, 環境配置不難還可以讓開發更直覺; GUI 庫因為看了很多大神分析利弊, 最後不選擇 PyQT 而選擇 PySide2 (最主要還是因為 LGPL 授權, PySide2 Introduction).

大綱

  1. 安裝 Python3.7
  2. 安裝 Visual studio code
  3. 安裝 PySide2
  4. 配置 VSCode
  5. 第一支 GUI 程式: Hello world

1. 安裝 Python3.7

現在已經釋出 Python 3.10, 但我選擇較為常見的 Python 3.7 (各版本 Python 下載: Python Download), 比較需要注意的是 Python3.x 並不相容 Python2.x, 網路上有許多方法可以共存切換.

下載 Python 3.7.9 安裝完成之後, 打開命令提示字元 (開始 → 輸入cmd) 輸入 python --version 做確認,

1
2
C:\Users\blavince>python --version
Python 3.7.9

※注意安裝時不管有沒有改變預設安裝路徑, 都有讓 Python 加入環境變數, 否則再手動加入.

此時在cmd 輸入 python 可以進入交互模式, 只是在 VScode 上更便利.

1
2
3
4
5
6
7
8
9
10
C:\Users\blavince>python
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a=1
>>> b=2
>>> a+b
3
>>> quit()

C:\Users\blavince>

2. 安裝 Visual studio code

下載 VS Code 並安裝. (圖片參考官網)

3. 安裝 PySide2

安裝 Python3.7.9 後就自帶 pip 跟 pip3 了, 所以安裝 PySide2 只要在 cmd 輸入

1
pip install PySide2

安裝完成之後直接在 cmd 輸入 python 進入交互模式後, 輸入 import PySide2 做確認.

1
2
3
4
5
C:\Users\blavince>python
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide2
>>>

4. 配置 VSCode

Ctrl+shift+x 或者主要工具欄上的延伸模組分頁鈕安裝 VScode 的 Python/PySide2 套件, 讓 GUI 開發的過程更方便, 這個套件可以在 VScode 上加入右鍵直接快捷創建新 .ui 檔以及打開 qt designer 做 GUI 的設計, 還有將 .ui 檔轉譯成 .py 檔案

延伸模組分頁鈕 PySide2套件

配置 PySide2
把 qt designer 路徑加入 C:\Users\blavince\AppData\Local\Programs\Python\Python37\Scripts\pyside2-designer.exe

到這裡就完成整個環境配置了, 可以寫個簡單的 Hello world 試試看.

5. 第一支 GUI 程式: Hello world

開發思路如下流程,

  1. 使用 qt designer 編輯 .ui 檔設計界面 (直接滑鼠拉元件)
  2. 將 .ui 檔轉譯 .py 檔
  3. 寫 .py 的入口函數執行 GUI 程式

1. 使用 qt designer 編輯 .ui 檔設計界面 (直接滑鼠拉元件)
在工作區的空白處右鍵 PySdie2: New Form in Designer/Creator 用 qt designer 來開啟一個 .ui 檔.

開啟 qt designer → Main Window → 建立(R)

然後在 qt designer 上拉一個 Label 元件到表單內修改成 HELLO WORLD → 儲存 Form.ui, 內容是 <xml> 們.

2. 將 .ui 檔轉譯 .py 檔

入口函數動態載入 .ui 檔或者先將 .ui 轉成 .py 入口函數再靜態載入兩種做法, 各有優缺點, 這裡介紹後者, 對著 Form.ui 右鍵 → PySide2: Compile Form to Python → 自動產出 Ui_Form.py (等同於 cmd 的 pyside2-uic .\Form.ui -o .\Ui_Form.py)

3. 寫 .py 的入口函數執行 GUI 程式

因為每次 UI_Form.py 的介面設計有更動後都會被覆蓋, 所以我們直接在裡面修改不好開發,
所以我習慣新增檔案 mainWindow.py 引入介面編寫邏輯, 而 UI_Form.py 為純介面檔案, 最後再新增一個 Entry.py 為入口函數

mainWindow.py

1
2
3
4
5
6
7
8
9
10
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtWidgets import QApplication, QMainWindow
from Ui_Form import Ui_MainWindow

class mainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(mainWindow, self).__init__(parent)
self.setupUi(self)

Entry.py

1
2
3
4
5
6
7
8
9
import sys
from PySide2.QtWidgets import QApplication
from mainWindow import mainWindow

if __name__ == "__main__":
app = QApplication(sys.argv)
w = mainWindow()
w.show()
sys.exit(app.exec_())

然後用 python 去執行 Entry.py
對著 Entry.py 右鍵 → Run Python File in Teminal → GUI 程式 (等同於 cmd 的 python ./Entry.py)

6. Python 導入 dll

myChipLibrary.cpp 導出有 get_chip_id 的 API 如下時 (myChipLibrary.dll),

1
2
3
4
5
6
7
8
EXPORT_DLL int __cdecl get_chip_id(PBYTE Res)
{
int err = 0;
Res = ...;
err = ...;

return err;
}

myChipLibrary.dll 與 Python 檔放在同資料夾然後程式碼最上方加 ctypes, 只要簡單的一行 CDLL 就可以導入並使用這個 API,

1
2
3
4
5
6
7
from ctypes import *


chipApi = CDLL("myChipLibrary.dll")
getID = chipApi.get_chip_id
_chipid = c_byte(0x0)
err = getID(byref(_chipid))

7. pyinstaller 打包成執行檔

可以直接打包成一個執行檔案 *.exe , 但要注意如果將含有需授權或者版權問題.

從 pip 安裝

1
pip install pyinstaller

常用參數

常用參數介紹

pyinstaller -h 來查看參數

參數 說明
-F 打包成一個exe文件
–icon –icon=圖標路徑
-w 將背景黑控制台隱藏
-c 使用控制台,無視窗
-D 創建一個目錄,包含exe以及其他一些依賴性文件

舉例:

1
pyinstaller.exe -F -w Entry.py

會產生 build/ 是打包過程的資料夾及 dist/ 因為我們有加 -F 會產生只一個 Entry.exe.