控制面版
PyQt5
Qt 是一個廣泛使用的 C++ 框架,用於開發具有豐富圖形用户界面的應用程式,而 PyQt5 則是 Qt 框架的 Python 版本,可用來創建桌面應用程式。
主要特點
跨平台兼容性:PyQt5 可以在 Windows、Mac OS 和 Linux 等多個作業系統上運行,使得開發的應用能在不同平台上具有一致的表現和功能。
豐富的元件:PyQt5 提供了許多標準的 GUI 元件,如按鈕、對話框、滑塊、表格和更多複雜的元件,如日曆或者瀏覽器引擎。
事件處理:在 PyQt5 中,幾乎所有的事件(如鍵盤按鍵、滑鼠點擊等)都是通過事件處理機制來管理,允許開發者定義應用程式該如何回應各種事件。
支持數據可視化和圖形:PyQt5 可以使用 Qt Charts 或 QML 等工具,在應用程式中添加圖表或者動態圖形。
模組化和擴展性: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 協助)