如果你是刚踏入计算机专业的新生,可能已经用 Python 打印过 "Hello World",处理过简单的数据,但有没有想过给自己做一个带窗口、按钮的小工具?比如一个专属的课程表程序、简易记事本,甚至是一个迷你计算器?

今天要讲的 PyQt5,就是能帮你实现这些想法的 "魔法工具"—— 它能让你用 Python 写出带图形界面(GUI)的程序,不用死磕复杂的底层代码,新手也能快速上手。

🔥🔥🔥🔥文章结尾附有完整版天气预报查询项目🔥🔥🔥🔥


一、为什么要学 PyQt5?​

你打开的浏览器、用的微信、电脑上的各种软件,本质上都是 "图形界面程序"—— 有窗口、按钮、输入框这些可视化元素。虽然 Python 能处理数据、做计算,但没有界面的话,总感觉少了点 "实用性"。​

PyQt5 就是 Python 里最流行的 GUI 库之一,它的优点特别适合新手:​

  • 简单直观:用几行代码就能做出一个窗口,控件(按钮、输入框等)拖拖拽拽(或者写几行代码)就能摆放​
  • 功能强大:从简单的小工具到复杂的专业软件(比如视频编辑器、数据分析工具)都能做​
  • 跨平台:写一次代码,能在 Windows、Mac、Linux 上都运行​
  • 免费开源:不用担心版权问题,随便用​

对于大一新生来说,学 PyQt5 不仅能做出 "看得见" 的成果,还能帮你理解 "事件驱动" 编程(比如点击按钮触发动作),这是很多软件的核心逻辑。


二、先把 PyQt5 请进电脑​

1. 安装 PyQt5​

打开终端(Windows 用命令提示符,Mac/Linux 用终端),输入安装命令:

pip install pyqt5 -i https://mirrors.aliyun.com/pypi/simple/

安装完成后,再装一个辅助工具(用于查看控件样式,可选但推荐):

pip install pyqt5-tools -i https://mirrors.aliyun.com/pypi/simple/

!!!!滴滴:不知道怎么安装第三方库或者想换用国内镜像源加速下载,可以点击链接跳转推荐学习文章↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Python国内镜像源全攻略:加速你的第三方库下载

极速配置!Anaconda换用国内pip镜像源,一劳永逸解决下载龟速!

2. 验证安装是否成功​

打开 Python 编辑器(比如 VS Code、IDLE),输入这段代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget

# 创建应用实例
app = QApplication(sys.argv)
# 创建窗口
window = QWidget()
# 设置窗口标题
window.setWindowTitle("我的第一个PyQt5窗口")
# 设置窗口大小(宽x高)
window.resize(400, 300)
# 显示窗口
window.show()
# 运行应用
sys.exit(app.exec_())

如果运行后弹出一个标题为 "我的第一个 PyQt5 窗口" 的空白窗口,说明安装成功了!这个窗口可以拖动、最大化、最小化,和你平时用的软件窗口一模一样。


三、核心概念:窗口和控件​

就像盖房子需要地基和砖块,PyQt5 程序也有两个核心要素:​

  • 窗口(QWidget):相当于房子的框架,所有东西都要放在窗口里​
  • 控件(Widgets):相当于砖块、家具,比如按钮(QPushButton)、标签(QLabel)、输入框(QLineEdit)等​

1. 第一个带控件的窗口​

我们来给空白窗口加个标签和按钮,代码如下(每一步都有注释):

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, 
                             QLabel, QPushButton)

# 创建应用
app = QApplication(sys.argv)

# 创建窗口
window = QWidget()
window.setWindowTitle("带控件的窗口")
window.resize(300, 200)  # 宽300,高200

# 创建标签(显示文字)
label = QLabel("Hello PyQt5!", window)  # 第二个参数指定父窗口
label.move(100, 50)  # 移动到坐标(100,50)的位置(窗口左上角为原点)

# 创建按钮
button = QPushButton("点击我", window)
button.move(100, 100)  # 位置在(100,100)

# 显示窗口
window.show()

# 运行应用
sys.exit(app.exec_())

运行后会看到一个窗口,里面有一行文字和一个按钮。这里的move(x,y)是手动设置控件位置,但这种方式不够灵活(窗口大小改变时控件不会自动调整),后面会讲更智能的 "布局管理器"。

2. 让按钮动起来:事件绑定​

按钮的作用是 "被点击后做某事",比如点击后弹出消息框。这需要用到 "事件绑定"—— 给按钮绑定一个函数,点击时就执行这个函数。

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, 
                             QLabel, QPushButton, QMessageBox)

# 定义点击按钮时执行的函数
def on_button_click():
    # 弹出消息框
    QMessageBox.information(window, "提示", "按钮被点击啦!")

app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("带交互的窗口")
window.resize(300, 200)

label = QLabel("点击下面的按钮", window)
label.move(100, 50)

button = QPushButton("点击我", window)
button.move(100, 100)

# 绑定事件:按钮被点击时,调用on_button_click函数
button.clicked.connect(on_button_click)

window.show()
sys.exit(app.exec_())

现在点击按钮,会弹出一个提示框,这就是最基本的交互逻辑。clicked.connect()是 PyQt5 中最常用的绑定方式,记住这个写法!


四、布局管理器:让界面更整洁​

手动用move()设置控件位置很麻烦,尤其是窗口大小改变时,控件会显得乱七八糟。这时候就需要 "布局管理器",它能自动调整控件的位置和大小,让界面更专业。​

PyQt5 常用的布局有两种:​

  • 垂直布局(QVBoxLayout):控件上下排列​
  • 水平布局(QHBoxLayout):控件左右排列​

1. 垂直布局示例

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, 
                             QLabel, QPushButton, QVBoxLayout)

app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("垂直布局")
window.resize(300, 200)

# 创建垂直布局
layout = QVBoxLayout()

# 创建三个控件
label = QLabel("这是一个标签")
button1 = QPushButton("按钮1")
button2 = QPushButton("按钮2")

# 把控件添加到布局里
layout.addWidget(label)
layout.addWidget(button1)
layout.addWidget(button2)

# 给窗口设置布局
window.setLayout(layout)

window.show()
sys.exit(app.exec_())

运行后会看到三个控件垂直排列,并且会随着窗口大小变化自动调整位置(拉伸窗口试试)。布局管理器会自动分配空间,比手动定位方便多了。

2. 布局嵌套:垂直 + 水平​

复杂界面需要多种布局组合,比如上面放一个标签,下面放两个水平排列的按钮:

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, 
                             QLabel, QPushButton, 
                             QVBoxLayout, QHBoxLayout)

app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("布局嵌套")
window.resize(300, 200)

# 主布局(垂直)
main_layout = QVBoxLayout()

# 上面的标签
label = QLabel("请选择一个操作")
main_layout.addWidget(label)

# 下面的水平布局(放两个按钮)
button_layout = QHBoxLayout()
button1 = QPushButton("确定")
button2 = QPushButton("取消")
button_layout.addWidget(button1)
button_layout.addWidget(button2)  # 两个按钮水平排列

# 把水平布局添加到主布局里
main_layout.addLayout(button_layout)

# 设置窗口布局
window.setLayout(main_layout)

window.show()
sys.exit(app.exec_())

这种嵌套布局能实现各种复杂界面,是 PyQt5 布局的核心技巧。


五、常用控件大集合​

除了标签和按钮,PyQt5 还有很多常用控件,我们来认识几个最基础的:​

1. 输入框(QLineEdit):获取用户输入

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, 
                             QPushButton, QLineEdit, QVBoxLayout,
                             QMessageBox)

def on_submit():
    # 获取输入框的内容
    text = input_box.text()
    if text:
        QMessageBox.information(window, "输入结果", f"你输入的是:{text}")
    else:
        QMessageBox.warning(window, "警告", "请输入内容!")

app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("输入框示例")
layout = QVBoxLayout()

# 提示标签
layout.addWidget(QLabel("请输入你的名字:"))

# 输入框
input_box = QLineEdit()  # 创建输入框
input_box.setPlaceholderText("在这里输入...")  # 提示文字
layout.addWidget(input_box)

# 提交按钮
submit_btn = QPushButton("提交")
submit_btn.clicked.connect(on_submit)
layout.addWidget(submit_btn)

window.setLayout(layout)
window.resize(300, 150)
window.show()
sys.exit(app.exec_())

QLineEdit的text()方法可以获取输入的内容,setPlaceholderText()能设置提示文字,很适合做表单输入。

2. 复选框(QCheckBox)和单选框(QRadioButton)​

复选框用于多选,单选框用于单选,比如选择兴趣爱好(多选)或性别(单选):

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, 
                             QCheckBox, QRadioButton, QVBoxLayout,
                             QHBoxLayout, QPushButton, QMessageBox)

def on_check_submit():
    # 收集选中的复选框
    hobbies = []
    if cb1.isChecked():
        hobbies.append("读书")
    if cb2.isChecked():
        hobbies.append("运动")
    if cb3.isChecked():
        hobbies.append("游戏")
    QMessageBox.information(window, "爱好", f"你的爱好是:{','.join(hobbies)}")

def on_radio_submit():
    # 获取选中的单选框
    gender = "未知"
    if rb1.isChecked():
        gender = "男"
    elif rb2.isChecked():
        gender = "女"
    QMessageBox.information(window, "性别", f"你选择的是:{gender}")

app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("选择控件示例")
main_layout = QVBoxLayout()

# 复选框部分
main_layout.addWidget(QLabel("请选择你的爱好(可多选):"))
cb1 = QCheckBox("读书")
cb2 = QCheckBox("运动")
cb3 = QCheckBox("游戏")
main_layout.addWidget(cb1)
main_layout.addWidget(cb2)
main_layout.addWidget(cb3)
check_btn = QPushButton("提交爱好")
check_btn.clicked.connect(on_check_submit)
main_layout.addWidget(check_btn)

# 单选框部分(需要用QButtonGroup分组,否则可以多选)
main_layout.addWidget(QLabel("\n请选择你的性别:"))
rb_layout = QHBoxLayout()
rb1 = QRadioButton("男")
rb2 = QRadioButton("女")
rb_layout.addWidget(rb1)
rb_layout.addWidget(rb2)
main_layout.addLayout(rb_layout)
radio_btn = QPushButton("提交性别")
radio_btn.clicked.connect(on_radio_submit)
main_layout.addWidget(radio_btn)

window.setLayout(main_layout)
window.resize(300, 300)
window.show()
sys.exit(app.exec_())

复选框用isChecked()判断是否选中,单选框需要注意分组(默认情况下多个单选框是独立的,需要用QButtonGroup确保只能选一个,上面的例子简化了分组,实际使用时建议加上)。


六、综合案例:做一个个人信息收集小工具​

我们把前面学的控件和布局结合起来,做一个能收集姓名、性别、爱好,并显示结果的小工具:

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QLineEdit,
                             QCheckBox, QRadioButton, QPushButton,
                             QVBoxLayout, QHBoxLayout, QGroupBox,
                             QMessageBox, QButtonGroup)

class InfoCollector(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()  # 初始化界面

    def init_ui(self):
        self.setWindowTitle("个人信息收集")
        self.resize(400, 350)

        # 主布局
        main_layout = QVBoxLayout()

        # 1. 姓名输入
        name_layout = QHBoxLayout()
        name_layout.addWidget(QLabel("姓名:"))
        self.name_edit = QLineEdit()
        name_layout.addWidget(self.name_edit)
        main_layout.addLayout(name_layout)

        # 2. 性别选择(用QGroupBox分组更美观)
        gender_group = QGroupBox("性别")
        gender_layout = QHBoxLayout()
        self.gender_group = QButtonGroup()  # 单选框分组
        self.rb_male = QRadioButton("男")
        self.rb_female = QRadioButton("女")
        self.gender_group.addButton(self.rb_male, 1)
        self.gender_group.addButton(self.rb_female, 2)
        gender_layout.addWidget(self.rb_male)
        gender_layout.addWidget(self.rb_female)
        gender_group.setLayout(gender_layout)
        main_layout.addWidget(gender_group)

        # 3. 爱好选择
        hobby_group = QGroupBox("爱好")
        hobby_layout = QVBoxLayout()
        self.cb_read = QCheckBox("读书")
        self.cb_sport = QCheckBox("运动")
        self.cb_game = QCheckBox("游戏")
        hobby_layout.addWidget(self.cb_read)
        hobby_layout.addWidget(self.cb_sport)
        hobby_layout.addWidget(self.cb_game)
        hobby_group.setLayout(hobby_layout)
        main_layout.addWidget(hobby_group)

        # 4. 提交按钮
        self.submit_btn = QPushButton("提交信息")
        self.submit_btn.clicked.connect(self.collect_info)  # 绑定事件
        main_layout.addWidget(self.submit_btn)

        # 设置主布局
        self.setLayout(main_layout)

    def collect_info(self):
        # 收集姓名
        name = self.name_edit.text().strip()
        if not name:
            QMessageBox.warning(self, "提示", "请输入姓名!")
            return

        # 收集性别
        gender = "未选择"
        if self.rb_male.isChecked():
            gender = "男"
        elif self.rb_female.isChecked():
            gender = "女"

        # 收集爱好
        hobbies = []
        if self.cb_read.isChecked():
            hobbies.append("读书")
        if self.cb_sport.isChecked():
            hobbies.append("运动")
        if self.cb_game.isChecked():
            hobbies.append("游戏")
        if not hobbies:
            hobbies.append("无")

        # 显示结果
        result = f"姓名:{name}\n性别:{gender}\n爱好:{','.join(hobbies)}"
        QMessageBox.information(self, "个人信息", result)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = InfoCollector()
    window.show()
    sys.exit(app.exec_())

这个案例用了类来组织代码(更规范),包含了输入框、单选框、复选框、分组控件,还做了简单的输入验证(比如姓名不能为空)。运行后,填写信息并点击提交,就能看到收集的结果,是不是很有成就感?


七、新手常见问题解决​

  1. 中文显示乱码:PyQt5 默认支持中文,但如果遇到标签文字乱码,在创建控件时用QLabel("中文内容", self)即可,确保代码文件编码是 UTF-8(一般编辑器默认都是)。​
  1. 窗口闪退:程序运行后窗口一闪就消失,通常是因为没写sys.exit(app.exec_()),这行代码是启动应用的事件循环,必须加在最后。​
  1. 控件不显示:可能是没把控件添加到布局,或者没给窗口设置布局。记住:用了布局后,必须调用window.setLayout(layout)。​
  1. 找不到模块:运行时提示No module named 'PyQt5',说明没安装成功,重新执行pip install pyqt5,确保网络通畅。

八、进阶学习方向​

学会了基础后,你可以尝试这些有趣的方向:​

  • 做一个课程表程序:用 QTableWidget 展示课程,添加保存到文件功能​
  • 简易文本编辑器:用 QTextEdit 做输入区,添加打开、保存文件功能​
  • 图片查看器:用 QPixmap 显示图片,实现切换、缩放功能​
  • 用 Qt Designer 可视化设计界面:PyQt5 自带的可视化工具,拖拖拽拽就能画界面,再把界面转为 Python 代码(新手后期可以学)

🔥🔥🔥🔥附:使用pyqt5搭建天气预报查询系统:

从零打造桌面天气预报工具:PyQt5 实战开发全解析(附完整项目代码)


九、总结​

PyQt5 让 Python 做图形界面变得简单:从一个窗口、一个按钮开始,逐步添加控件和交互,就能做出实用的小工具。对于大一新生来说,不用纠结复杂的理论,先动手做出能运行的程序,再慢慢理解背后的逻辑 —— 比如 "事件驱动" 是什么、布局管理器的原理是什么。​

最关键的是多练:试着把身边的需求变成程序,比如给班级做一个签到工具,给自己做一个每日计划提醒器。当你能用代码解决实际问题时,编程的乐趣就会油然而生。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐