跳至主要內容

控制面版

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 协助)