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、运行结果如下:

