基于 PyQt5 的桌面应用开发实战:登录、预测、计算器、摄像头多功能系统

随着 Python 生态的不断完善,桌面软件开发不再局限于传统 C++/C# 技术栈,Python 凭借简洁的语法、丰富的第三方库,在快速开发、原型设计、小型工具开发中占据重要地位。PyQt5 作为 Qt 框架的 Python 绑定,继承了 Qt 的稳定性与美观性,支持拖拽式 UI 设计,大幅降低桌面应用开发门槛。

本文围绕四大核心功能模块展开实战教学:

  1. 用户登录模块:实现账号密码验证与界面跳转;
  2. 价格预测模块:基于决策树回归模型,输入玉米、豆粕价格,输出预测结果并展示图表;
  3. 计算器模块:支持完整算式输入、整数运算、清空、错误处理;
  4. 摄像头调用模块:基于 OpenCV 实现实时画面读取、显示与开关控制。

全文遵循UI 设计→代码编写→功能调试→优化完善的开发逻辑,所有代码均经过实测可直接运行,适合 PyQt5 初学者、机器学习部署开发者、桌面工具开发者学习参考。

一、开发环境与核心技术准备

1.1 开发环境配置

本文使用 Python 3.8 + 版本,核心依赖库如下:

bash 复制代码
pip install pyqt5
pip install pyqt5-tools
pip install scikit-learn
pip install pandas
pip install openpyxl
pip install joblib
pip install opencv-python
pip install numpy
  • PyQt5:桌面 UI 开发核心库;
  • Qt Designer:可视化 UI 设计工具,无需手写界面代码;
  • scikit-learn/joblib:机器学习模型训练与加载;
  • OpenCV:摄像头视频流处理;
  • pandas/numpy:数据读取与数值计算。

1.2 核心技术原理

  1. 信号与槽机制:PyQt5 核心通信方式,按钮点击、文本输入等事件触发对应函数执行;
  2. UI 与业务分离 :Qt Designer 生成.ui文件,通过pyuic5转换为.py界面文件,业务逻辑单独编写,避免修改自动生成代码;
  3. 模型部署 :将训练好的机器学习模型保存为.pkl文件,在 PyQt5 中直接加载调用;
  4. 视频流渲染:OpenCV 读取摄像头帧数据,转换为 Qt 支持的图像格式,实时显示在界面标签中。

具体环境开发配置可以去:https://blog.csdn.net/m0_57021623/article/details/123459038?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220a6bae78e90c5bc43c32623f471582b6%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=0a6bae78e90c5bc43c32623f471582b6&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-123459038-null-null.142^v102^pc_search_result_base6&utm_term=pyqt5&spm=1018.2226.3001.4187

这个链接下的博客文章,其中讲解细致,我就不多讲了,感谢这位博主提供的资源

二、模块一:登录界面开发(win3.py + 登录主程序)

2.1 UI 设计(win3.py

登录界面是系统入口,包含账号标签、密码标签、账号输入框、密码输入框、登录按钮 。使用 Qt Designer 拖拽布局,生成win3.ui后转换为win3.py,该文件为自动生成代码,禁止手动修改。

界面核心组件:

  • textEdit_2:账号输入框,默认值admin
  • textEdit_3:密码输入框,默认值1234567890
  • pushButton:登录按钮,触发登录验证函数。

2.2 业务逻辑实现

登录模块核心功能:验证账号密码是否正确,验证通过后跳转到主功能界面。代码继承QMainWindowUi_MainWindow,实现界面初始化与登录验证。

python 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from win3 import Ui_MainWindow

class LoginWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("用户登录")
        # 绑定登录按钮点击事件
        self.pushButton.clicked.connect(self.check_login)

    def check_login(self):
        # 获取输入的账号密码
        username = self.textEdit_2.toPlainText().strip()
        password = self.textEdit_3.toPlainText().strip()
        # 简单验证逻辑
        if username == "admin" and password == "1234567890":
            QMessageBox.information(self, "提示", "登录成功!")
            self.close()
            # 此处可跳转到主功能界面
        else:
            QMessageBox.warning(self, "错误", "账号或密码错误!")

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

2.3 功能说明

  • 输入框支持手动修改账号密码;
  • 登录验证失败弹出警告框,成功弹出提示框并关闭登录界面;
  • 可扩展:连接数据库实现多用户登录、记住密码、验证码等功能。

三、模块二:玉米豆粕价格预测系统(win1.py + 预测主程序)

3.1 功能需求

输入玉米价格、豆粕价格,点击预测按钮,调用训练好的决策树模型输出预测值;点击清空按钮清空所有输入框;点击打开图表按钮展示数据可视化图片。

3.2 UI 设计(win1.py

界面包含:

  • 三个标签:玉米、豆粕、预测值;
  • 三个输入框:lineEdit(玉米)、lineEdit_2(豆粕)、lineEdit_3(预测结果);
  • 三个按钮:预测、清空、打开图表;
  • 图片展示标签label_4

信号绑定:

  • 预测按钮→predict_price
  • 清空按钮→清空三个输入框;
  • 打开图表按钮→showbiao

3.3 机器学习模型训练(模型训练并保存本地.py

使用决策树回归模型训练价格预测模型,读取 Excel 数据,拆分训练集与测试集,训练后保存为tree_model.pkl,方便 PyQt5 调用。

python 复制代码
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')
    print("模型训练完成,已保存为tree_model.pkl")

if __name__ == '__main__':
    train_tree()

3.4 预测功能实现(预测_清空.py)

加载训练好的模型,获取输入框数值,转换为数组后调用predict方法,将结果显示在预测值输入框。

python 复制代码
import joblib
import numpy as np
from PyQt5.QtWidgets import QMainWindow, QMessageBox
from win1 import Ui_MainWindow
import sys

class PredictWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("价格预测系统")
        # 加载模型
        self.model = joblib.load('tree_model.pkl')

    def predict_price(self):
        try:
            # 获取输入并转为整数
            corn = int(self.lineEdit.text())
            soybean = int(self.lineEdit_2.text())
            # 模型预测
            res = self.model.predict(np.array([[corn, soybean]]))
            self.lineEdit_3.setText(str(round(res[0], 2)))
        except ValueError:
            QMessageBox.warning(self, "输入错误", "请输入有效数字!")

    def showbiao(self):
        # 展示本地图片
        from PyQt5.QtGui import QPixmap
        pix = QPixmap("tupiao.png")
        self.label_4.setPixmap(pix)
        self.label_4.setScaledContents(True)

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

3.5 功能亮点

  • 输入非数字自动弹出警告,提升用户体验;
  • 模型本地加载,无需重复训练,响应速度快;
  • 支持图片可视化展示,适合数据分析场景。

四、模块三:整数计算器开发(win4.py + 计算器主程序)

4.1 需求优化

用户要求:输入框显示完整算式、整数运算无小数点、AC 完全清空、计算后不拼接旧结果

4.2 UI 设计(win4.py

标准计算器布局:

  • 数字按钮:0-9;
  • 运算符按钮:+、-、*、/;
  • 功能按钮:AC(清空)、=(计算);
  • 大号输入框lineEdit,显示完整算式与结果。

信号绑定:

  • 数字按钮→append_num
  • 运算符按钮→set_operator
  • = 按钮→calculate_result
  • AC 按钮→清空输入框。

4.3 计算器核心代码

采用eval函数直接计算完整算式,强制转换为整数,避免小数点,完善错误处理。

python 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from win4 import Ui_MainWindow

class CalculatorWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("整数计算器")

    def append_num(self):
        # 追加数字到输入框
        text = self.lineEdit.text() + self.sender().text()
        self.lineEdit.setText(text)

    def set_operator(self):
        # 追加运算符
        text = self.lineEdit.text() + self.sender().text()
        self.lineEdit.setText(text)

    def calculate_result(self):
        try:
            expr = self.lineEdit.text()
            # 整数运算,无小数点
            result = int(eval(expr))
            self.lineEdit.setText(str(result))
        except ZeroDivisionError:
            self.lineEdit.setText("不能除以0")
        except:
            self.lineEdit.setText("输入错误")

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

4.4 优化说明

  • 支持12+34*5完整算式输入,符合日常使用习惯;
  • 强制整数运算,结果无.0后缀;
  • AC 按钮完全清空,计算后重新输入不会拼接旧结果;
  • 除零错误、语法错误自动提示,稳定性强。

五、模块四:摄像头实时调用系统(win2.py + 摄像头主程序)

5.1 功能需求

点击按钮打开 / 关闭摄像头,实时显示画面在界面标签,支持视频流流畅渲染。

5.2 UI 设计(win2.py

  • 图片展示标签label
  • 开关按钮pushButton,控制摄像头启停。

信号绑定:按钮点击→slot1

5.3 OpenCV 视频流处理

使用QTimer定时读取摄像头帧,转换为 Qt 支持的 RGB 格式,实时渲染。

python 复制代码
import cv2
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer
from win2 import Ui_MainWindow
import sys

class CameraWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowTitle("摄像头调用")
        self.cap = cv2.VideoCapture(0)
        self.timer = QTimer()
        self.timer.timeout.connect(self.show_frame)
        self.is_open = False

    def slot1(self):
        # 开关控制
        self.is_open = not self.is_open
        if self.is_open:
            self.pushButton.setText("关闭摄像头")
            self.timer.start(30)
        else:
            self.pushButton.setText("打开摄像头")
            self.timer.stop()
            self.label.clear()

    def show_frame(self):
        ret, frame = self.cap.read()
        if ret:
            # 转换为RGB格式
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            h, w, ch = frame.shape
            bytes_per_line = ch * w
            q_img = QImage(frame.data, w, h, bytes_per_line, QImage.Format_RGB888)
            self.label.setPixmap(QPixmap.fromImage(q_img))
            self.label.setScaledContents(True)

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

5.4 功能说明

  • 一键开关,状态自动切换;
  • 视频流流畅无卡顿,支持画面自适应;
  • 关闭后自动清空显示区域,释放资源。

六、总结

本文完整实现登录、预测、计算器、摄像头 四大 PyQt5 桌面应用模块,覆盖 UI 设计、信号槽、机器学习部署、图像处理、数值计算等核心技术。所有代码遵循UI 与业务分离的工程化规范,可直接运行、二次开发。

通过本文学习,读者可掌握:

  1. Qt Designer 快速设计界面;
  2. PyQt5 信号与槽机制使用;
  3. 机器学习模型在桌面端部署;
  4. OpenCV 与 PyQt5 结合实现视频显示;
  5. 桌面应用错误处理与用户体验优化

PyQt5 作为成熟的桌面开发框架,适合开发各类小工具、管理系统、数据分析软件。本文提供的实战案例,可作为 PyQt5 入门到进阶的学习资料,也可直接用于课程设计、毕业设计、项目开发。

相关推荐
于慨2 小时前
flutter基础组件用法
开发语言·javascript·flutter
历程里程碑2 小时前
二叉树---翻转二叉树
开发语言·c++·elasticsearch·链表·搜索引擎·tornado·dash
B325帅猫-量子前沿技术研究所2 小时前
PSD和FFT的关系
人工智能·算法
AI周红伟2 小时前
周红伟:梁文峰DeepSeek V4 终极对决 GPT-6,梁文锋透露 DeepSeek V4 将于 4 月下旬发布
人工智能·gpt·深度学习·微信·自然语言处理·openclaw
Java小白笔记2 小时前
Claude-Code 完全指南
人工智能·ai·全文检索·ai编程·ai写作
曦樂~2 小时前
【机器学习】分类Classification
人工智能·机器学习·分类
cd_949217212 小时前
新北洋亮相2026 CHINASHOP:以“智印零售全生态”赋能效率与增长
大数据·人工智能·零售
lizz6662 小时前
Hermes-Agent:使用SOUL.md设定智能体身份
人工智能
3Dmax效果图渲染研习社2 小时前
ai生成的视频有没有版权?注意事项
人工智能·ai作画·aigc