跳至主要內容

控制面版

Jia-Yin大约 4 分鐘comm

PyQt5

Qt 是一個廣泛使用的 C++ 框架,用於開發具有豐富圖形用户界面的應用程式,而 PyQt5 則是 Qt 框架的 Python 版本,可用來創建桌面應用程式。

主要特點

  1. 跨平台兼容性:PyQt5 可以在 Windows、Mac OS 和 Linux 等多個作業系統上運行,使得開發的應用能在不同平台上具有一致的表現和功能。

  2. 豐富的元件:PyQt5 提供了許多標準的 GUI 元件,如按鈕、對話框、滑塊、表格和更多複雜的元件,如日曆或者瀏覽器引擎。

  3. 事件處理:在 PyQt5 中,幾乎所有的事件(如鍵盤按鍵、滑鼠點擊等)都是通過事件處理機制來管理,允許開發者定義應用程式該如何回應各種事件。

  4. 支持數據可視化和圖形:PyQt5 可以使用 Qt Charts 或 QML 等工具,在應用程式中添加圖表或者動態圖形。

  5. 模組化和擴展性:PyQt5 的設計可以根據需要引入不同的模組,並且支持使用 C++ 以及 Qt 的其他語言擴展。

常見用途

  • 桌面軟體開發:開發獨立運行的桌面應用程式。
  • 商業軟體:創建業務管理系統、數據分析工具等。
  • 教育和科研工具:開發教學軟體或科研數據處理工具。
  • 自動化腳本:創建圖形用户界面來控制和自動化腳本的運行。

安裝方法

可以使用 pip 來安裝 PyQt5:

pip install PyQt5

這個命令會安裝 PyQt5 及其依賴套件,以用來開發基於 PyQt5 的應用程式。

注意

GNU Radio 的 Python 環境已經搭載了 PyQt5 的套件,因此在 GNU Radio 的環境中,不需要再重新安裝 PyQt5。

控制面版

以下試著用 PyQt5 撰寫一個簡單的控制面版。程式碼的説明,可參照註解的説明文字。

import sys
from PyQt5 import Qt

class Panel(Qt.QWidget):

    stations = {
        "警察廣播電台(94.3)": 94.3,
        "寰宇廣播電台(96.7)": 96.7,
        "台北流行廣播電台(91.7)": 91.7,
    }

    def __init__(self):
        super().__init__() # parent initialization
        self.setWindowTitle("廣播電台") # set title

        vlayout = Qt.QVBoxLayout(self) # create a vertical layout
        self.setLayout(vlayout) # set the layout
        
        for name, freq in self.stations.items(): # loop items
            btn = Qt.QRadioButton(name) # add a button
            btn.toggled.connect(self.changeFreq) # connect click event
            vlayout.addWidget(btn) # put into the vlayout

    def changeFreq(self):   # event handler
        btn = self.sender() # get sender button
        print(btn.text())   # print button text      
        print(self.stations[btn.text()]) # print frequency  

if __name__ == "__main__":
    # create application, sys.argv is command line arguments
    app = Qt.QApplication(sys.argv) 
    panel = Panel() # create a panel instance
    panel.show()    # show the panel
    sys.exit(app.exec_()) # start the event loop

上述的程式中,app 物件以及 app.exec_() 函數,主要用來進入 Qt 程式的事件迴圈,這樣 panel 物件才能處理使用者所設定的點擊事件。

試著執行上述程式,應該會得到下列的結果。點擊按鈕並觀察終端機的輸出。另外也可以試著把視窗拉大,觀察佈局的變化。

關於 if __name__ == "__main__"

在 Python 中,if __name__ == "__main__": 這一行的用途是確定程式碼是被直接運行或則被引入(import)到其他的 Python 程式中作為模組使用。這行程式碼背後的機制是基於 Python 的 __name__ 變數。

__name__ 變數的作用

當 Python 程式檔被直接運行時,__name__ 變數被設置為 "__main__"。這意味著如果你在命令行中運行 python script.py,並且 script.py 包含了 if __name__ == "__main__":,那麼這個 if 內的程式碼將被執行。

相反地,如果該程式檔被其他 Python 程式引入為模組,例如通過 import script 語句,__name__ 將被設置為該模組的名稱(在這個例子中是 "script"),而 if __name__ == "__main__": 內的程式碼則不會被執行。

這個功能使得開發者可以對 Python 程式檔進行更靈活的控制,特別是在撰寫可重複使用的模組和測試程式碼。開發者可以在這個 if 敘述下放置測試程式碼或主程式,這樣只有當程式檔被直接執行時才會執行這些程式碼。

練習 3

試著修改上述的程式碼,增加電台,或者改變佈局。(可用生成式 AI 協助)