PyQt5 四大实战案例详解:从基础窗口到智能应用

目录

一、PyQt5 基础窗口程序

二、机器学习集成:农产品价格预测系统

三、实时视频处理:

四、逻辑交互工具:PyQt5 计算器

五、四大程序核心总结

六、总结


PyQt5 作为 Python 主流的 GUI 开发框架,搭配 Qt Designer 可快速实现可视化界面开发。本文将通过基础窗口、农产品价格预测、实时摄像头显示、计算器四大实战案例,带你快速掌握 PyQt5 界面开发与功能实现,覆盖基础语法、机器学习集成、多媒体处理、逻辑交互全场景。

一、PyQt5 基础窗口程序


代码作用
这是 PyQt5 入门级程序,用于学习 PyQt5 程序的标准结构,实现一个最简单的桌面窗口,包含窗口大小、位置、标题设置,是所有复杂界面的基础。
核心功能
1. 创建应用程序实例与基础窗口
2. 自定义窗口尺寸、显示位置、标题
3. 启动程序主循环,保持窗口正常运行
适用场景
学习 PyQt5 基础语法、理解窗口生命周期、搭建最简 GUI 程序。

前端页面设计:

Label(文本标签)显示文字提示、标题、图片,不支持交互,用于界面说明与展示。

Line Edit(单行输入框)接收用户单行输入,如账号、密码、数字、价格等。

Push Button(按钮)用于触发点击事件,如登录、计算、开关、提交等,是 GUI 交互核心。

Text Edit(多行文本框)用于输入 / 显示大段文字、日志、内容编辑,支持换行和滚动。

代码实现:

from PyQt5 import QtCore, QtGui, QtWidgets  # 导入PyQt5的主要模块
from PyQt5.QtCore import *                 # 导入QtCore模块的所有内容,用于核心功能
from PyQt5.QtGui import *                  # 导入QtGui模块的所有内容,用于图形功能
from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox  # 导入QtWidgets模块中的一些特定类
'''QFileDialog可以帮助用户选择文件路径
QMainWindow则是创建具有菜单、工具栏和状态栏的主窗口的起点。
QMessageBox可以用于向用户显示提示或警告信息'''

from win0 import Ui_MainWindow  # 导入UI类,这个类包含了你的主窗口设计
import sys   # 导入系统模块,用于访问命令行参数和系统相关功能

class PyQtMainEntry(QMainWindow, Ui_MainWindow):  # 定义一个继承自QMainWindow和Ui_MainWindow的类
    def __init__(self):  # 构造函数
        super().__init__()  # 调用基类的构造函数进行初始化
        self.setupUi(self)  # 调用setupUi方法,根据Ui_MainWindow设计设置界面
        # 参数初始化



    # '''定义要触发的函数'''
    # def predict_price(self):
    # def showbiao(self):
    # def slot1(self):
    #     print('金色传说')

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)  # 创建应用程序实例
    window = PyQtMainEntry()  # 创建主窗口实例
    window.show()  # 显示主窗口
    sys.exit(app.exec_())  # 进入事件循环,并确保在退出时清理

运行结果:

按钮功能:点击打印 “金色传说”

# 按钮点击触发的函数
def slot1(self):
    print('金色传说')

 按钮绑定

self.pushButton_2.clicked.connect(self.slot1)

核心语法

按钮对象.clicked.connect(函数名)

当按钮被点击 → 执行 slot1 函数

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QMessageBox
from win0 import Ui_MainWindow
import sys

class PyQtMainEntry(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # ———————— 按钮绑定 ————————
        # pushButton_2 点击 → 执行 slot1
        self.pushButton_2.clicked.connect(self.slot1)

    # ———————— 按钮点击功能 ————————
    def slot1(self):
        print("金色传说")

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

保存,再将win0.ui通过Pyuic变成win.py文件

然后运行上面的python代码,点击按钮 → 控制台输出 “金色传说”


二、机器学习集成:农产品价格预测系统


将训练好的机器学习模型与 PyQt5 界面结合,实现可视化预测工具,无需编写复杂命令行,普通用户可直接输入数据获取预测结果。
核心功能
1. 加载本地决策树模型(tree_model.pkl)
2. 输入玉米、大豆价格,一键完成价格预测
3. 一键清空所有输入输出框
4. 展示数据分析图表(Figure_1.png)
5. 输入异常值时自动弹出错误提示
适用场景
机器学习模型落地、数据预测工具、农产品价格分析、轻量化智能客户端。

1.先进行模型训练保存到本地

均价数据:

模型训练

import numpy as np
from sklearn.tree import DecisionTreeRegressor
import joblib
import pandas as pd
from sklearn.model_selection import train_test_split

def train_tree():
    data = pd.read_excel('均价数据.xlsx')

    x = data.iloc[:, 1:-1]
    y = data.iloc[:, -1]
    # 数据切分
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)
    # 创建决策树分类器对象
    tree = DecisionTreeRegressor()
    tree.fit(x_train, y_train)
    # 保存模型
    joblib.dump(tree, 'tree_model.pkl')


if __name__ == '__main__':
    train_tree()

    # loaded_model = joblib.load('tree_model.pkl')
    # print(loaded_model.predict(np.array([[2819,3601]])))

2.前端页面设计:

3.用pycharm实现:

1. 导入需要的库
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QMessageBox
import numpy as np
import joblib
import sys
from untitled import Ui_MainWindow
from PyQt5.QtGui import QPixmap
  • PyQt5:制作桌面窗口、按钮、输入框
  • numpy:处理数据,给模型输入
  • joblib:加载训练好的机器学习模型
  • QPixmap:显示图片
  • QMessageBox:弹出错误提示框
  • untitled:Qt Designer 设计好的界面文件
2. 主窗口类
class PyQtMainEntry(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

创建主窗口
加载界面(按钮、输入框、标签)
setupUi(self) 是把界面显示出来

3. 加载机器学习模型
self.model = joblib.load('tree_model.pkl')

程序启动时,加载提前训练好的 决策树模型。

4. 按钮绑定功能
self.pushButton.clicked.connect(self.predict_price)   # 预测
self.pushButton_2.clicked.connect(self.clear_all)     # 清空
self.pushButton_3.clicked.connect(self.showbiao)      # 显示图片

 PyQt5 的信号与槽:

按钮 1 → 预测
按钮 2 → 清空
按钮 3 → 显示图片

5. 价格预测功能
    def predict_price(self):
        try:
            corn_price = int(self.lineEdit.text())
            soybean_price = int(self.lineEdit_2.text())

            predicted_price = self.model.predict(np.array([[corn_price,soybean_price]]))
            self.lineEdit_3.setText(str(predicted_price[0]))

        except ValueError:
            QMessageBox.warning(self,'错误','请输入有效的价格')

1. 获取两个输入框的价格
2. 传给机器学习模型
3. 模型预测结果
4. 显示到第三个输入框
5. 如果输入不是数字 → 弹出错误提示

6. 一键清空功能
def clear_all(self):
    self.lineEdit.clear()
    self.lineEdit_2.clear()
    self.lineEdit_3.clear()

清空所有输入框,方便重新输入

7. 显示图片功能
def showbiao(self):
    try:
        pixmap = QPixmap("Figure_1.png")
        self.label_4.setPixmap(pixmap)
    except Exception as e:
        print("Error loading image:",e)

加载 Figure_1.png 图片,显示在界面的标签上。

8. 程序启动入口
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = PyQtMainEntry()
    window.show()
    sys.exit(app.exec_())

创建应用
显示窗口
启动程序循环
保持窗口不关闭

预测结果:

打开对照表将图片显示出来:

三、实时视频处理:

摄像头画面显示系统 代码作用 结合 OpenCV 与 PyQt5,调用电脑摄像头实现实时视频采集与界面显示,是图像处理、视觉监控的基础程序。 核心功能 调用系统默认摄像头,实时采集视频流 定时器定时刷新画面,保证视频流畅显示 按钮控制摄像头开启 / 关闭 自动适配界面尺寸,优化画面显示效果 窗口关闭时自动释放摄像头资源 适用场景 视频监控、人脸识别界面、图像处理工具、直播画面预览、视觉项目开发。

import sys
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(740, 600)  # 窗口大小适配640x480画面+按钮
        # 中心部件(PyQt5主窗口必须有centralwidget)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        # 1. 摄像头画面显示Label
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(50, 30, 640, 480))  # 位置+大小
        self.label.setObjectName("label")
        self.label.setText("")  # 初始无文字
        self.label.setScaledContents(True)  # 自适应Label大小

        # 2. 摄像头开关按钮
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(320, 530, 100, 40))  # 位置+大小
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setText("打开")  # 初始文字

        # 绑定中心部件
        MainWindow.setCentralWidget(self.centralwidget)
        # 界面文字翻译(标准结构)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

class PyQtMainEntry(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

 # 初始化摄像头
        self.camera1 = cv2.VideoCapture(0)
        self.is_camera_opened = False  # 摄像头是否开启的标志

        # 定时器:30ms获取一帧
        self._timer = QtCore.QTimer(self)
        self._timer.timeout.connect(self._queryFrame)
        self._timer.setInterval(30)

        # 补充:绑定按钮点击事件到槽函数(原代码缺失,必须加)
        self.pushButton.clicked.connect(self.slot1)

    def slot1(self):
        # 槽函数,用于响应按钮点击事件
        self.is_camera_opened = not self.is_camera_opened
        if self.is_camera_opened:
            self.pushButton.setText("关闭")
            self._timer.start()
        else:
            self.pushButton.setText("打开")
            self._timer.stop()

    def _queryFrame(self):
        # 私有方法,用于从摄像头获取并处理新帧
        ret1, self.frame1 = self.camera1.read()
        if not ret1:  # 补充:读取失败直接返回,避免程序崩溃
            return
        self.frame11 = cv2.resize(self.frame1, dsize=(640, 480))
        if ret1:
            qimage = cv2.cvtColor(self.frame11, cv2.COLOR_BGR2RGB)
            qimage = QtGui.QImage(qimage.data, qimage.shape[1], qimage.shape[0],
                                  QtGui.QImage.Format_RGB888)
            pixmap = QtGui.QPixmap.fromImage(qimage)
            self.label.setPixmap(pixmap)

    # 补充:窗口关闭事件,释放摄像头资源(避免程序退出后摄像头被占用)
    def closeEvent(self, event):
        if self.camera1.isOpened():
            self.camera1.release()
        self._timer.stop()
        event.accept()

# -------------------------- 主函数入口(原代码缺失,必须加) --------------------------
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PyQtMainEntry()
    window.show()
    sys.exit(app.exec_())

运行结果展示:

四、逻辑交互工具:PyQt5 计算器


基于 PyQt5 实现标准计算器功能,通过按钮点击完成四则运算,包含输入校验、异常处理、结果实时显示,是学习界面交互与逻辑判断的经典案例。

前端设计:

代码实现:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QMessageBox
import sys
# 导入Qt Designer生成的界面类
from 计算机 import Ui_MainWindow


class PyQtMainEntry(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("PyQt5计算器")

        # 存储当前输入的表达式
        self.expression = ""

        # -------------------------- 绑定所有按钮的点击事件 --------------------------
        # 数字按钮 0-9
        self.pushButton_0.clicked.connect(lambda: self.append_num("0"))
        self.pushButton_1.clicked.connect(lambda: self.append_num("1"))
        self.pushButton_2.clicked.connect(lambda: self.append_num("2"))
        self.pushButton_3.clicked.connect(lambda: self.append_num("3"))
        self.pushButton_4.clicked.connect(lambda: self.append_num("4"))
        self.pushButton_5.clicked.connect(lambda: self.append_num("5"))
        self.pushButton_6.clicked.connect(lambda: self.append_num("6"))
        self.pushButton_7.clicked.connect(lambda: self.append_num("7"))
        self.pushButton_8.clicked.connect(lambda: self.append_num("8"))
        self.pushButton_9.clicked.connect(lambda: self.append_num("9"))

        # 运算符按钮
        self.pushButton_add.clicked.connect(lambda: self.append_op("+"))
        self.pushButton_sub.clicked.connect(lambda: self.append_op("-"))
        self.pushButton_mul.clicked.connect(lambda: self.append_op("*"))
        self.pushButton_div.clicked.connect(lambda: self.append_op("/"))

        # 功能按钮
        self.pushButton_eq.clicked.connect(self.calculate_result)  # = 按钮
        self.pushButton_clear.clicked.connect(self.clear_expression)  # clear 按钮

    # -------------------------- 数字输入:追加数字到表达式 --------------------------
    def append_num(self, num):
        self.expression += num
        self.pushButton_com.setText(self.expression)  # 实时显示在label上

    # -------------------------- 运算符输入:追加运算符 --------------------------
    def append_op(self, op):
        # 避免连续输入运算符(比如 1++2)
        if self.expression and self.expression[-1] not in "+-*/":
            self.expression += op
            self.pushButton_com.setText(self.expression)

    # -------------------------- 计算结果:执行表达式 --------------------------
    def calculate_result(self):
        try:
            # 用eval执行表达式,得到结果
            result = eval(self.expression)
            # 显示结果,同时更新表达式为结果(支持连续计算)
            self.expression = str(result)
            self.pushButton_com.setText(self.expression)
        except ZeroDivisionError:
            # 除零错误
            QMessageBox.warning(self, "错误", "除数不能为0!")
            self.clear_expression()
        except SyntaxError:
            # 语法错误(比如 1+2* 不完整)
            QMessageBox.warning(self, "错误", "输入的表达式不合法!")
            self.clear_expression()
        except Exception as e:
            # 其他未知错误
            QMessageBox.warning(self, "错误", f"计算出错:{str(e)}")
            self.clear_expression()

    # -------------------------- 清空表达式:重置所有输入 --------------------------
    def clear_expression(self):
        self.expression = ""
        self.pushButton_com.setText("")


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

运行结果展示:


核心功能
1. 数字 0-9、加减乘除输入
2. 等号一键计算表达式结果
3. 清空按钮重置所有输入
4. 避免连续输入运算符,提升使用体验
5. 捕获除零、语法错误,防止程序崩溃

五、四大程序核心总结

程序类型核心技术主要作用
基础窗口QApplication + QWidget学习 PyQt5 基础结构
价格预测PyQt5 + 机器学习模型智能模型可视化落地
摄像头显示PyQt5 + OpenCV实时视频采集与界面显示
计算器信号与槽 + 表达式计算界面交互与逻辑判断

六、总结

以上四段代码覆盖了 PyQt5 从入门到实战的全流程: 基础窗口掌握程序结构 机器学习集成实现智能应用 OpenCV 结合实现多媒体处理 计算器完成交互逻辑开发 通过这四个案例,可快速掌握 PyQt5 界面开发、工具配置、功能扩展的核心能力,轻松开发各类桌面端 GUI 应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值