用 PyQt5 搭个专属小工具:Python GUI 入门超简单(附完整版天气预报查询项目)
如果你是刚踏入计算机专业的新生,可能已经用 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/
!!!!滴滴:不知道怎么安装第三方库或者想换用国内镜像源加速下载,可以点击链接跳转推荐学习文章↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
极速配置!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_())
这个案例用了类来组织代码(更规范),包含了输入框、单选框、复选框、分组控件,还做了简单的输入验证(比如姓名不能为空)。运行后,填写信息并点击提交,就能看到收集的结果,是不是很有成就感?
七、新手常见问题解决
- 中文显示乱码:PyQt5 默认支持中文,但如果遇到标签文字乱码,在创建控件时用QLabel("中文内容", self)即可,确保代码文件编码是 UTF-8(一般编辑器默认都是)。
- 窗口闪退:程序运行后窗口一闪就消失,通常是因为没写sys.exit(app.exec_()),这行代码是启动应用的事件循环,必须加在最后。
- 控件不显示:可能是没把控件添加到布局,或者没给窗口设置布局。记住:用了布局后,必须调用window.setLayout(layout)。
- 找不到模块:运行时提示No module named 'PyQt5',说明没安装成功,重新执行pip install pyqt5,确保网络通畅。
八、进阶学习方向
学会了基础后,你可以尝试这些有趣的方向:
- 做一个课程表程序:用 QTableWidget 展示课程,添加保存到文件功能
- 简易文本编辑器:用 QTextEdit 做输入区,添加打开、保存文件功能
- 图片查看器:用 QPixmap 显示图片,实现切换、缩放功能
- 用 Qt Designer 可视化设计界面:PyQt5 自带的可视化工具,拖拖拽拽就能画界面,再把界面转为 Python 代码(新手后期可以学)
🔥🔥🔥🔥附:使用pyqt5搭建天气预报查询系统:
从零打造桌面天气预报工具:PyQt5 实战开发全解析(附完整项目代码)
九、总结
PyQt5 让 Python 做图形界面变得简单:从一个窗口、一个按钮开始,逐步添加控件和交互,就能做出实用的小工具。对于大一新生来说,不用纠结复杂的理论,先动手做出能运行的程序,再慢慢理解背后的逻辑 —— 比如 "事件驱动" 是什么、布局管理器的原理是什么。
最关键的是多练:试着把身边的需求变成程序,比如给班级做一个签到工具,给自己做一个每日计划提醒器。当你能用代码解决实际问题时,编程的乐趣就会油然而生。
更多推荐
所有评论(0)