PyQt 入門,用 Python 寫第一支 GUI

前言

Python 的 GUI 框架有很多種,之前用過一個超容易入門的 wxPython,不過總覺得有點太陽春,於是開始研究 PyQt。

Qt 是一個跨平台的 GUI 框架,支援 Windows、MacOS、Linux 等各大作業系統,其主要使用的程式語言是 C++,但想要在 Windows 上開發 C++ ⋯⋯摁想到要安裝 Compiler 我就頭痛,於是說到跨平台、最容易安裝、又最好入門的程式語言就是 Python 了,所以 Qt 同時推出了一個 Qt for Python,讓大家可以開心的用 Python 來編寫 GUI 應用程式。

安裝

首先需要依序安裝以下東西:

  1. Python – 建議 3.7 以上版本,MacOS 建議用內建的 brew 工具安裝
  2. PyQt5 – 請到 Terminal 裡面輸入 pip install PyQt5
  3. Qt Designer – 用來設計 GUI 長相的工具

開發流程大致如下:

  1. 先用 Qt Designer 設計好界面,產生一個 .ui
  2. 進 Terminal 輸入以下指令產生可引入的 .py
    pyuic5 -x example.ui -o example_ui.py 主程式產生畫面用
  3. 建立一支主程式 .py 檔引入上一步做好的 .py 檔們,就可以執行主程式囉!

界面設計

打開 Qt Designer,New 一份 UI 設計檔,然後就在選 Template 卡住了 XD

除了繼承自不同 Class 之外,這幾個的主要差異是用途的不同:

  • Dialog 系列的就是做彈出對話框那種用的
  • Main Window 指的是主程式入口用,就是 GUI 打開時的第一個畫面
  • Widget 我的理解就是 Main Window 預設拿掉 Menu Bar 跟 Status Bar 的簡易版 XD

其實要用哪一個都可以啦,不過按字面的意思就先選擇 Main Window 來用吧~按下 Create 之後就會出現一個空白的視窗畫面,這時直接存檔就可以得到我們所需要的第一個 .ui 檔案,這邊命名為 example.ui

產生可引入的Python檔

有了這份 .ui 檔,裡面就描述了 GUI 要長什麼樣子的各種資訊,但是這些資訊在 Python 中並無法被直接使用,所以要先轉檔成 .py 檔以提供我們的 Python GUI 程式使用,這個指令在安裝 PyQt5 時就一併裝好了所以可以直接使用。

pyuic5 -x example.ui -o example_ui.py
如果有使用資源,則另需要以下指令:pyrcc5 resource.qrc -o resource.rc

這時其實產生出來的 .py 檔就已經可以獨立運作了。

python3 example_ui.py

雖然只是開啟一個空畫面,但我們的第一支 GUI 應用程式就這麼完成了!

搞定!

並沒有。如果我們為了增加功能開始在 example_ui.py 裡面 Coding 的話就完蛋了。因為每當我們修改完 .ui 檔案之後都要重新產生一次這個 .py 檔然後就覆蓋掉了,所以建議完全不要編寫這個產生出來的檔案。

建立主程式

因此最後一步就是,建立一支編寫功能用的 .py 主程式檔來引入它,這裡命名為 example_main.py

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
import example_ui as ui

class Main(QMainWindow, ui.Ui_MainWindow):
    def __init__(self):
         super().__init()
         self.setupUi(self)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

看起來相當複雜,但相信我這已經是我看過最簡單的寫法了。如果能夠理解的話,產生GUI佈局的關鍵就是第8行 setupUi 這個 Method。

python3 example_main.py

再執行一次,這次我們要跑的檔案是 example_main.py,應該會看到跟剛剛一樣的空白畫面,喔耶成功。

雖然一個功能都沒有實作還很無聊,但看到畫面出來的瞬間還是有感動一下。

下一篇來講基本的功能實作。

References

  1. Qt for Python