1 基本介绍
1.1 简介
,QT 是最强大的 GUI 库之一,PyQt 是 Python 绑定 QT 应用的框架,是最强大和流行的跨平台 GUI 库之一。
PyQt 兼容所有流行的操作系统,包括 Windows、Linux 和 Mac OS。 它是双重许可的,可在 GPL 和商业许可下使用。新的稳定版本是 PyQt5,最新版本的 PyQt 可从其官网下载 − riverbankcomputing.com
PyQt API 是一组包含大量类和函数的模块:
QtCore − 其他模块使用的核心非 GUI 类
QtGui − 图形用户界面组件
QtMultimedia − 低级多媒体编程类
QtNetwork − 网络编程类
QtOpenGL − OpenGL 支持类
QtScript − 用于评估 Qt 脚本的类
QtSql − 使用 SQL 进行数据库集成的类
QtSvg − 显示 SVG 文件内容的类
QtWebKit − 用于呈现和编辑 HTML 的类
QtXml − 处理 XML 的类
QtWidgets − 用于创建经典桌面风格 UI 的类
QtDesigner − 用于扩展 Qt Designer 的类
1.2 安装
1)mac下安装
pip3 install PyQt5 -i https://pypi.douban.com/simple
执行以下代码验证安装是否成功

代码如下:
import sys
from PyQt5.QtWidgets import QWidget, QApplication
app = QApplication(sys.argv)
widget = QWidget()
widget.resize(640, 480)
widget.setWindowTitle("Hello, PyQt5!")
widget.show()
sys.exit(app.exec())
2)安装QtTools(这个工具看需要安装,可以直接安装下面第三步的)
Qt Tools 包含:
- 图形界面设计工具 Qt Designer,用于设计图形界面,生成 .ui文件,以 xml 格式存储界面和控件的属性;
- UI 文件转换工具 PyUic,用于将 .ui 文件解析为 .py 文件的工具。
Qt Tools 可以使用 pip 方式安装:
pip3 install PyQt5-tools -i https://pypi.douban.com/simple

3)VSCODE插件配置


找到Designer.app
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/qt5_applications/Qt


配置一下启动脚本


将脚本复制到 Designer.app 同级目录下,并将其路径配置到编辑器中即可


可用性验证


1.3 插件使用
1)创建new window

2)拖拽组件
3)保存成gui文件

4)生成对应的 py 文件

5)运行
添加下列代码

6)继续修改

7)每次更新都会覆盖,单独创建启动目录

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_tool
app = QtWidgets.QApplication(sys.argv) # 实例化 QApplication 类,作为 GUI 主程序入口
MainWindow = QtWidgets.QMainWindow() # 创建 MainWindow 类
ui = Ui_tool.Ui_MainWindow() # 实例 UI 类
ui.setupUi(MainWindow) # 设置窗体 UI
MainWindow.show() # 显示窗体
sys.exit(app.exec_()) # 当窗口创建完成,需要结束主循环过程
2 基本开发

2.1 常用组件
2.1.1 QComboBox
1)常用方法列表
| 方法 | 描述 |
|---|---|
| addItem() | 添加一个下拉选项 |
| addItems() | 从列表中添加下拉选项 |
| clear() | 删除下拉选项集合中的所有选项 |
| count() | 返回下拉选项集合中的数目 |
| currentText() | 返回选中选项的文本 |
| itemText(i) | 获取索引为i的item的选项文本 |
| currentIndex() | 返回选中项的索引 |
| setItemText(int index,text) | 更改指定索引的文本 |
2)常用信号(交互信息发送)
| 信号 | 含义 |
|---|---|
| Activated | 当用户选中一个下拉选项时发射该信号 |
| currentIndexChanged | 当下拉选项的索引发生改变时发射该信号 |
| highlighted | 当选中一个已经选中的下拉选项时,发射该信号 |
3)实例



2.1.2 QComboBox
QLineEdit
- QLineEdit是一个单行文本编辑控件;
- QLineEdit相关的一个类是QTextEdit,它允许多行文字以及富文本编辑;
QTextEdit
- QTextEdit可以显示多行、用来显示图像、列表和表格;
1)QLineEdit常用方法:
| 方法 | 描述 |
| text() | 取值 |
| setText() | 赋值 |
| setAlignment() | 根据对齐常量对齐文本 |
| clear() | 删除内容 |
| setMaxLength() | 设置输入的最大字符数 |
| setReadOnly() | 使文本框不可编辑 |
| setValidator() | 验证校验,可以正则校验 |
2)QLineEdit常用信号:
| 信号 | 含义 |
| cursorPositionChanged() | 每当光标移动触发 |
| editingFinished() | 当您按"Enter"或字段失去焦点时 |
| returnPressed() | 当你按下"Enter" |
| selectionChanged() | 每当所选文本发生变化时 |
| textChanged() | 当框中的文本通过输入或编程方式更改时 |
| textEdited() | 每当编辑文本时 |
3)实例



2.1.3 QPushButton
在 PyQt API 中,QPushButton 类对象提供了一个按钮,当单击该按钮时,可以对其进行编程以调用某个函数。
1)常用方法
| 方法 | 描述 |
| setCheckable() | 如果设置为 true,则识别按钮的按下和释放状态 |
| toggle() | 在可检查状态之间切换 |
| setIcon() | 显示由图像文件的像素图形成的图标 |
| setEnabled() | 当设置为 false 时,按钮变为禁用状态,因此单击它不会发出信号 |
| isChecked() | 返回按钮的布尔状态 |
| setDefault() | 将按钮设置为默认值 |
2)实例

2.1.4 QMenuBar、QMenu 和 QAction
QMenu 类提供了一个可以添加到菜单栏的小部件。 它还用于创建上下文菜单和弹出菜单。 每个 QMenu 对象可能包含一个或多个 QAction 对象或级联的 QMenu 对象。
。。。。。。
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
save = QAction("Save",self)
save.setShortcut("Ctrl+S")
file.addAction(save)
edit = file.addMenu("Edit")
edit.addAction("copy")
edit.addAction("paste")
quit = QAction("Quit",self)
file.addAction(quit)
file.triggered[QAction].connect(self.processtrigger)
self.setLayout(layout)
self.setWindowTitle("menu demo")
def processtrigger(self,q):
print q.text()+" is triggered"

2.1.5 其余常用组件
PyQt5 - 基本小部件
2.2 IP查询核心功能实现
实现输入IP查询IP的所属信息,用于IP资产列表(excel)的维护


1)windows.py
2) 添加Ip和查询IP

3)excel操作
import xlrd,xlwt
from xlutils.copy import copy
def addIP(ip,describe):
workbook = xlrd.open_workbook("ip.xlsx",encoding_override="utf-8")
# 获取原表格第一个sheet的名字
all_sheet = workbook.sheet_names()
first_sheet = workbook.sheet_by_name(all_sheet[0])
# 获取原表格第一个sheet一写入数据的行数
rows = first_sheet.nrows
# 拷贝新的excel,并从rows行开始追加写入
new_workbook = copy(workbook)
new_sheet = new_workbook.get_sheet(0)
new_sheet.write(rows, 0, ip)
new_sheet.write(rows, 1, describe)
new_workbook.save("ip.xlsx")
def createExcel():
testbook = xlwt.Workbook(encoding='utf-8')
testbook.add_sheet('ip')
testbook.save("ip.xlsx")
def findIP(ip):
workbook = xlrd.open_workbook("ip.xlsx",encoding_override="utf-8")
# 获取原表格第一个sheet的名字
all_sheet = workbook.sheet_names()
first_sheet = workbook.sheet_by_name(all_sheet[0])
rows = first_sheet.nrows
describe = "none"
for i in range(rows):
row = first_sheet.row_values(i)
if ip in row[0]:
describe = row[1]
return describe
核心逻辑实现完成,可以完成基本查询需要








![[数据结构 -- C语言] 栈(Stack)](https://img-blog.csdnimg.cn/img_convert/269e8d78fcd347b39d32a09c206d46a5.png)










