一、PyQt 是什么
PyQt 是一套Python 图形界面 GUI 库,用来做桌面软件窗口:按钮、输入框、表格、弹窗、菜单这些桌面程序界面。
- PyQt5:目前学习最主流版本
- PyQt6:新版,语法略有区别,新手优先学 PyQt5
简单理解:不用网页,直接做 Windows / Mac 本地桌面小程序,比如计算器、工具软件、上位机界面。
二、安装 PyQt5
打开 cmd 命令行执行安装
pip install pyqt5
安装完成之后就可以导入模块使用
import sys
from PyQt5.QtWidgets import QApplication, QWidget
两个必备导入:
sys:用来管理程序退出PyQt5.QtWidgets:存放所有窗口控件(按钮、标签、输入框)
三、第一个最简单窗口程序(案例 1)
import sys
# 导入需要的控件
from PyQt5.QtWidgets import QApplication, QWidget
# 1.创建应用程序对象,GUI程序必须要有
app = QApplication(sys.argv)
# 2.创建一个空白窗口
window = QWidget()
# 设置窗口标题
window.setWindowTitle("我的第一个PyQt窗口")
# 设置窗口大小 宽度400,高度300
window.resize(400, 300)
# 3.显示窗口
window.show()
# 4.启动程序消息循环,等待点击关闭按钮退出
sys.exit(app.exec_())
逐行详细解释
QApplication(sys.argv):整个 GUI 程序的核心实例 ,一个桌面程序只能创建 1 次;sys.argv接收命令行参数QWidget():最基础空白窗体,所有界面都继承它setWindowTitle():修改左上角窗口名字resize(宽,高):定义窗口尺寸window.show():默认窗口隐藏,调用 show 才看得见app.exec_():开启事件循环(监听鼠标点击、关闭窗口等操作)sys.exit():关闭窗口后正常退出进程
运行代码,直接弹出一个空白桌面窗口!
四、常用基础控件讲解 + 完整示例
案例 2:QLabel 文字标签(显示文本)
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
app = QApplication(sys.argv)
win = QWidget()
win.setWindowTitle("标签控件演示")
win.resize(400,200)
# 创建文字标签
label = QLabel("Hello PyQt!", win)
# 设置标签位置和大小 x,y,宽,高
label.setGeometry(50,50,200,40)
win.show()
sys.exit(app.exec_())
QLabel:展示文字、图片setGeometry(x坐标, y坐标, width, height):绝对定位控件在窗口中的位置 窗口左上角坐标为(0,0),向右 X 变大,向下 Y 变大
案例 3:QPushButton 按钮,点击触发事件(信号与槽!PyQt 最重要知识点)
信号与槽(Signal & Slot) 按钮被点击 = 信号 signal 执行一段函数代码 = 槽 slot 使用
按钮.clicked.connect(函数名)绑定点击动作
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
app = QApplication(sys.argv)
win = QWidget()
win.resize(400,250)
win.setWindowTitle("点击按钮测试")
# 创建标签
label = QLabel("还没有点击按钮", win)
label.setGeometry(50,30,250,30)
# 创建按钮
btn = QPushButton("点我!", win)
btn.setGeometry(50,80,120,40)
# 定义点击后执行的函数
def click_func():
label.setText("✅ 按钮已经被点击啦!")
# 绑定按钮点击信号和函数
btn.clicked.connect(click_func)
win.show()
sys.exit(app.exec_())
核心解释
QPushButton("文字",父窗口):创建按钮,第二个参数代表放在哪个窗口上btn.clicked:按钮自带的点击信号.connect(函数名):信号触发时,自动运行这个函数(函数不要写括号!)label.setText()修改标签文字
案例 4:QLineEdit 单行输入框(接收用户输入文字)
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit
app = QApplication(sys.argv)
win = QWidget()
win.resize(450,300)
win.setWindowTitle("输入框演示")
# 输入框控件
input_box = QLineEdit("", win)
input_box.setGeometry(50,40,250,35)
# 显示结果的标签
result_label = QLabel("您输入的内容:", win)
result_label.setGeometry(50,120,350,35)
# 获取按钮
def get_text():
# .text() 获取输入框里面的字符串
content = input_box.text()
result_label.setText(f"您输入的内容:{content}")
btn = QPushButton("获取输入", win)
btn.setGeometry(50,180,120,40)
btn.clicked.connect(get_text)
win.show()
sys.exit(app.exec_())
关键方法:
input_box.text()获取输入框文字input_box.clear()清空输入框
案例 5:QMessageBox 弹出提示弹窗
点击按钮弹出消息提示框
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox
app = QApplication(sys.argv)
win = QWidget()
win.resize(300,200)
def show_msg():
# 弹出提示框
QMessageBox.information(win, "提示窗口", "操作成功!")
btn = QPushButton("弹出提示", win)
btn.setGeometry(60,60,150,40)
btn.clicked.connect(show_msg)
win.show()
sys.exit(app.exec_())
弹窗种类:
QMessageBox.information()普通提示QMessageBox.warning()警告弹窗QMessageBox.critical()错误弹窗QMessageBox.question()确认选择框(是 / 否)
五、布局管理(不用手动写坐标!自动排版控件)
前面案例用 setGeometry() 绝对定位,窗口放大缩小控件不会跟着动。 布局 Layout:自动排列控件,窗口拉伸时控件自适应大小 三种最常用布局:
QVBoxLayout:垂直布局(控件从上往下排)QHBoxLayout:水平布局(控件从左往右排)QGridLayout:网格布局(表格形式多行多列)
案例 6:QVBoxLayout 垂直布局示例
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication(sys.argv)
win = QWidget()
win.resize(300,300)
win.setWindowTitle("垂直布局")
# 创建3个按钮
b1 = QPushButton("按钮1")
b2 = QPushButton("按钮2")
b3 = QPushButton("按钮3")
# 创建垂直布局对象
layout = QVBoxLayout()
# 把控件依次加入布局
layout.addWidget(b1)
layout.addWidget(b2)
layout.addWidget(b3)
# 将布局设置给窗口
win.setLayout(layout)
win.show()
sys.exit(app.exec_())
运行效果:按钮垂直均匀排列,拉大窗口按钮自动拉伸!
案例 7:QHBoxLayout 水平布局
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
app = QApplication(sys.argv)
win = QWidget()
win.resize(400,150)
b1 = QPushButton("A")
b2 = QPushButton("B")
b3 = QPushButton("C")
layout = QHBoxLayout()
layout.addWidget(b1)
layout.addWidget(b2)
layout.addWidget(b3)
win.setLayout(layout)
win.show()
sys.exit(app.exec_())
案例 8:嵌套布局(水平 + 垂直组合,复杂界面)
真实软件界面一般都是布局嵌套!
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout
app = QApplication(sys.argv)
win = QWidget()
win.resize(400,250)
# 三个按钮横向排列
h_layout = QHBoxLayout()
h_layout.addWidget(QPushButton("左"))
h_layout.addWidget(QPushButton("中"))
h_layout.addWidget(QPushButton("右"))
# 主布局垂直放一个按钮 + 上面的水平布局
main_layout = QVBoxLayout()
main_layout.addWidget(QPushButton("顶部大按钮"))
main_layout.addLayout(h_layout)
win.setLayout(main_layout)
win.show()
sys.exit(app.exec_())
addLayout():把子布局放进父布局,实现复杂界面排版
六、面向对象写法(正式项目标准写法!)
前面我们直接写全局代码,复杂程序推荐类继承 QWidget管理界面
案例 9:完整类封装模板(以后写软件都用这个格式)
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
# 自定义窗口类,继承QWidget
class MyWindow(QWidget):
def __init__(self):
super().__init__() # 调用父类构造函数,固定写法
self.init_ui() # 调用自己写的界面初始化函数
def init_ui(self):
# 在这个函数里面创建所有控件
self.setWindowTitle("面向对象版本")
self.resize(400,220)
self.label = QLabel("等待点击",self)
self.label.move(50,30)
self.btn = QPushButton("点击修改文字",self)
self.btn.move(50,80)
self.btn.clicked.connect(self.on_click)
# 按钮触发的方法,必须加self
def on_click(self):
self.label.setText("🎉成功触发类内部函数!")
# 程序入口
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
解释关键点
class MyWindow(QWidget):自定义窗口super().__init__()必须保留- 控件加上
self.变成实例属性,函数之间可以共用控件 if __name__ == "__main__":Python 程序入口规范,方便打包 exe
七、Qt Designer 可视化拖拽设计界面(不用手写全部控件!)
1. 打开设计工具
安装完成后命令行输入:
pyqt5-tools designer
打开可视化画布,鼠标拖拽按钮、输入框,画好界面保存为 .ui 文件。 然后用代码加载 ui 文件,不用一个个手写控件!
适合做大界面项目,工业上位机常用这个方式开发
八、实战小项目:简易加法计算器
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, QVBoxLayout
class CalcWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("简易加法计算器")
self.resize(350,250)
# 两个输入框
self.num1 = QLineEdit()
self.num2 = QLineEdit()
self.result_label = QLabel("结果:")
self.calc_btn = QPushButton("计算相加")
self.calc_btn.clicked.connect(self.calculate)
# 布局
layout = QVBoxLayout()
layout.addWidget(self.num1)
layout.addWidget(self.num2)
layout.addWidget(self.calc_btn)
layout.addWidget(self.result_label)
self.setLayout(layout)
def calculate(self):
try:
a = float(self.num1.text())
b = float(self.num2.text())
res = a + b
self.result_label.setText(f"结果:{a} + {b} = {res}")
except ValueError:
self.result_label.setText("❌请输入合法数字!")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = CalcWindow()
win.show()
sys.exit(app.exec_())
功能:输入两个数字,点击按钮求和,捕获输入错误!