随着 Python 生态的不断完善,桌面软件开发不再局限于传统 C++/C# 技术栈,Python 凭借简洁的语法、丰富的第三方库,在快速开发、原型设计、小型工具开发中占据重要地位。PyQt5 作为 Qt 框架的 Python 绑定,继承了 Qt 的稳定性与美观性,支持拖拽式 UI 设计,大幅降低桌面应用开发门槛。
本文围绕四大核心功能模块展开实战教学:
- 用户登录模块:实现账号密码验证与界面跳转;
- 价格预测模块:基于决策树回归模型,输入玉米、豆粕价格,输出预测结果并展示图表;
- 计算器模块:支持完整算式输入、整数运算、清空、错误处理;
- 摄像头调用模块:基于 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 核心技术原理
- 信号与槽机制:PyQt5 核心通信方式,按钮点击、文本输入等事件触发对应函数执行;
- UI 与业务分离 :Qt Designer 生成
.ui文件,通过pyuic5转换为.py界面文件,业务逻辑单独编写,避免修改自动生成代码; - 模型部署 :将训练好的机器学习模型保存为
.pkl文件,在 PyQt5 中直接加载调用; - 视频流渲染:OpenCV 读取摄像头帧数据,转换为 Qt 支持的图像格式,实时显示在界面标签中。
这个链接下的博客文章,其中讲解细致,我就不多讲了,感谢这位博主提供的资源
二、模块一:登录界面开发(win3.py + 登录主程序)
2.1 UI 设计(win3.py)
登录界面是系统入口,包含账号标签、密码标签、账号输入框、密码输入框、登录按钮 。使用 Qt Designer 拖拽布局,生成win3.ui后转换为win3.py,该文件为自动生成代码,禁止手动修改。
界面核心组件:
textEdit_2:账号输入框,默认值admin;textEdit_3:密码输入框,默认值1234567890;pushButton:登录按钮,触发登录验证函数。
2.2 业务逻辑实现
登录模块核心功能:验证账号密码是否正确,验证通过后跳转到主功能界面。代码继承QMainWindow与Ui_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 与业务分离的工程化规范,可直接运行、二次开发。
通过本文学习,读者可掌握:
- Qt Designer 快速设计界面;
- PyQt5 信号与槽机制使用;
- 机器学习模型在桌面端部署;
- OpenCV 与 PyQt5 结合实现视频显示;
- 桌面应用错误处理与用户体验优化
PyQt5 作为成熟的桌面开发框架,适合开发各类小工具、管理系统、数据分析软件。本文提供的实战案例,可作为 PyQt5 入门到进阶的学习资料,也可直接用于课程设计、毕业设计、项目开发。