控制面版
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 协助)