当前位置: 首页 > news >正文

pyside中多线程编程案例模型

1、通过designer设计出UI界面,然后将界面文件转为.py文件。

2、编写主程序,调用UI界面生成的py文件。

import os
import sysfrom PySide6 import QtWidgets
from PySide6.QtWidgets import *
from PySide6.QtCore import Qt, QSize, QPoint, QRect
from PySide6.QtGui import QIcon, QFont
from mainWindow_ui import Ui_MainWindow
from Control_Centrial.Control_main import ProductionLineWorkerclass MainWindow(QMainWindow):def __init__(self, parent=None):super().__init__(parent)self.ui = Ui_MainWindow()self.ui.setupUi(self)self.setWindowTitle("衔铁压装产线运行监控")self.setWindowIcon(QIcon(f'{os.path.dirname(os.path.abspath(__file__))}\\photo\\hlc.jpg'))# 移除默认标题栏self.setWindowFlags(Qt.WindowType.FramelessWindowHint)# 创建新的中央部件# QMainWindow 永远不要直接设置布局,而是设置中央部件,然后在中央部件中设置布局self.setCentralWidget(self.ui.centralwidget)    # 设置中央部件使得界面可缩放# 初始化工作线程self.workerThread = ProductionLineWorker()self.workerThread.start()# 连接信号槽self.connect_signals()def connect_signals(self):"""连接信号和槽"""# 连接信号槽self.ui.PowerButton.clicked.connect(lambda:self.close())# 连接工作线程信号到UI更新槽函数self.workerThread.status_update.connect(self.update_status)self.workerThread.data_update.connect(self.update_data_display)# 槽函数 - 更新UIdef update_status(self, status,deals):"""更新状态显示"""self.ui.lineEdit_errInfo.setText(status)self.ui.lineEdit_deal.setText(deals)  def update_data_display(self, index,data):   if index == 1:self.ui.lineEdit_1.setText(data['Serie'])self.ui.lineEdit_2.setText(data['product_id'])self.ui.lineEdit_3.setText(data['Encoding'])if index == 2:self.add_table_data(data)self.ui.lineEdit_1.clear()self.ui.lineEdit_2.clear()self.ui.lineEdit_3.clear()def add_table_data(self, data_dict):"""添加数据到表格"""# 获取当前行数current_row = self.ui.tableWidget.rowCount()# 插入新行self.ui.tableWidget.insertRow(current_row)       # 填充数据self.ui.tableWidget.setItem(current_row, 0, QTableWidgetItem(data_dict.get('timestamp', '')))self.ui.tableWidget.setItem(current_row, 1, QTableWidgetItem(data_dict.get('Serie', '')))self.ui.tableWidget.setItem(current_row, 2, QTableWidgetItem(data_dict.get('product_id', '')))self.ui.tableWidget.setItem(current_row, 3, QTableWidgetItem(data_dict.get('Encoding', '')))# 质量状态列,可以设置颜色quality_item = QTableWidgetItem(data_dict.get('quality', ''))if data_dict.get('quality') == 'OK':quality_item.setBackground(Qt.green)elif data_dict.get('quality') == 'NG':quality_item.setBackground(Qt.red)self.ui.tableWidget.setItem(current_row, 4, quality_item)# 设置水平和垂直都居中for col in range(self.ui.tableWidget.columnCount()):item = self.ui.tableWidget.item(current_row, col)if item is not None:item.setTextAlignment(Qt.AlignCenter)  # 水平和垂直都居中# 自动滚动到最后一行self.ui.tableWidget.scrollToBottom()# 限制表格最大行数if self.ui.tableWidget.rowCount() > 100:self.ui.tableWidget.removeRow(0)         # 删除第一行def delete_selected_row(self):"""删除选中的行"""current_row = self.ui.tableWidget.currentRow()if current_row >= 0:self.ui.tableWidget.removeRow(current_row)def delete_all_rows(self):"""删除所有行"""self.ui.tableWidget.setRowCount(0)     if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)win = MainWindow()win.show()app.exit(app.exec())  

3、编写后台工作线程,并实现与主程序通讯更新界面显示:

import os
import sys
import time
import random
from datetime import datetimefrom PySide6 import QtWidgets
from PySide6.QtWidgets import *
from PySide6.QtCore import Qt, QSize, QPoint, QRect, QThread, Signal
from PySide6.QtGui import QIcon, QFont
from mainWindow_ui import Ui_MainWindow# 工作线程类 - 直接继承QThread
class ProductionLineWorker(QThread):# 定义各种信号status_update = Signal(str, str)          # 状态更新信号data_update = Signal(int, dict)           # 数据更新信号def __init__(self):super().__init__()self.is_running = Falsedef run(self):"""线程主函数 - 重写QThread的run方法"""self.is_running = Trueself.status_update.emit("产线启动中...","等待启动完成")try:while self.is_running:# 模拟一个生产周期self.production_cycle()# 短暂休息time.sleep(0.1)except Exception as e:self.status_update.emit(f"产线运行错误: {str(e)}","")finally:self.status_update.emit("产线线程结束","")def production_cycle(self):"""模拟一个生产周期"""# 阶段1: 上料for progress in range(0, 10):if not self.is_running:returnself.status_update.emit(f"上料中... {progress}%","")time.sleep(0.1)# 发送完整数据data = {'Serie': "Serie001",'product_id': "DCM-08C8T1",'Encoding': "UT24895A"}self.data_update.emit(1,data)# 阶段2: 连杆压装for progress in range(0, 10):if not self.is_running:returnself.status_update.emit(f"连杆压装中... {progress}%","")time.sleep(0.1)# 阶段3: 连杆焊接打磨for progress in range(0, 10):if not self.is_running:returnself.status_update.emit(f"连杆焊接打磨中... {progress}%","")time.sleep(0.1)# 阶段4: 衔铁压装焊接for progress in range(1, 10):if not self.is_running:returnself.status_update.emit(f"衔铁压装焊接中... {progress}%","")time.sleep(0.1)# 模拟质量检测结果quality_result = random.choice(["OK", "OK", "OK", "NG"])# 发送完整数据data = {'timestamp': datetime.now().strftime("%H:%M:%S"),'Serie': "Serie001",'product_id': "DCM-08C8T1",'Encoding': "UT24895A",'quality': quality_result}self.data_update.emit(2,data)def stop_production(self):"""停止生产"""self.is_running = Falseself.status_update.emit("产线停止中...","")

4、文件目录结构如下:

main.py用来显示界面,Contorl_main.py用来实现后台控制。

5、运行结果如下:

 

http://www.dtcms.com/a/520846.html

相关文章:

  • 怎么做整蛊网站wordpress注册rest
  • 网站开通微信支付收费免费的ppt模板下载软件
  • 快速开发工具网站长沙网页制作设计
  • wordpress 搬站长沙企业seo服务
  • [人工智能-大模型-54]:模型层技术 - 数据结构+算法 = 程序
  • PHP调试,宝塔xdebug+vscode
  • 直接做的视频网站制作网站品牌公司
  • 【TypeScript】TypeScript 内置的工具类型(十四)
  • 烟台建设集团招聘信息网站自然堂网站建设情况
  • 网站开发文档的示例上海广告公司联系方式
  • Java(方法引用)
  • 让类支持比较操作:Python魔法方法详解与实践指南
  • 国产化Excel开发组件Spire.XLS教程:在Python中将Pandas DataFrame导出到Excel的详细教程
  • 招生网站建设策划方案建站 公司
  • Spring AI Alibaba Admin 正式开源!Java 企业级 AI 多智能体开发,从 0 到 1 落地指南
  • 牛品推荐|分类分级效能飞跃:美创智能数据安全分类分级平台
  • Redis发布订阅【充当消息中间件】
  • 高端网站制作平台企业策划书怎么写
  • 衡水企业做网站费用可以做用户画像的网站
  • 格式化输入/输出函数
  • 基于类内类间优化的元学习少样本故障诊断方法
  • 【02】C语言-变量的声明与赋值,printf格式化输出函数,sizeof()运算符
  • JDBC 全解析:从入门到实战,掌握数据库交互核心技术
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(7):文法運用
  • o2o网站平台怎么做知名网站排行榜
  • 移除原有 Git 仓库关联,在IDEA中重新初始化 Git 并推送到新仓库(详细图解、包含相关问题的解决办法)
  • 宠物网站建设福州企业如何建网站
  • 米兔音乐 1.0.1| 高音质电脑免费听歌,支持无损下载(夸克网盘),无广告干扰
  • 网站推广方法有中国万维网官网域名注册网站
  • 【C++】嵌套类访问外围类的私有成员