Python+PyQt5实现网口功能测试详解
作者:漂泊_人生
这篇文章主要为大家详细介绍了Python+PyQt5实现网口功能测试的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
UI界面:
实现代码
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'NetOpeningWinFrm.ui' # # Created by: PyQt5 UI code generator 5.15.2 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. import sys from PyQt5 import * from PyQt5.Qt import * from PyQt5 import QtWidgets from PyQt5 import QtGui from PyQt5 import QtCore import logging import os import json import configparser import psutil #pip install psutil #import serial import subprocess import io #import glob #import re#正则表达式 #pip install pyserial class AnalysisThread(QtCore.QThread): test_result_signal = QtCore.pyqtSignal(tuple) # 新增信号,传递一个包含设备路径和测试结果的元组 finished_signal = QtCore.pyqtSignal() # 新增信号,表示线程完成 def __init__(self,devicepath,type,parent=None): super(AnalysisThread, self).__init__(parent) self.devicepath = devicepath self.type = type self.is_running = True def run(self): result = False index=0 if self.parent().rnetTestCount>0: index=self.parent().rnetTestCount-1 result = self.parent().GetTestPortInfoAndTest(self.devicepath) print('resutl:',result) if result: print("Before removal:", self.parent().rnetPortName) self.parent().rnetPortName.remove(self.devicepath) print("After removal:", self.parent().rnetPortName) device_info = [] device_info.append(self.devicepath)#连接状态 device_info.append(self.parent().rnConnetcion[index])#连接状态 device_info.append(self.parent().rnetRate[index])#速率 device_info.append(self.parent().rnetMacAddress[index])#MacAddress self.parent().TableAddItem(device_info,True)#添加PASS数据 #端口数 self.parent().lbl_GetPortNum.setText(str(self.parent().rnetTestCount))#设置测试端口数 self.parent().lbl_GetPortNum.setStyleSheet("background-color: lightgreen;") # 后置端口背景色设置为浅绿色 #连接状态 self.parent().lbl_GetConntion.setText(self.parent().rnConnetcion[index])#设置连接状态 self.parent().lbl_GetPortNum.setStyleSheet("background-color: lightgreen;") # 后置端口背景色设置为浅绿色 #速率 self.parent().lbl_GetRate.setText(self.parent().rnetRate[index]+'M') self.parent().lbl_GetRate.setStyleSheet("background-color: lightgreen;") # 后置端口背景色设置为浅绿色 else: if self.parent().rnetFailInfo: device_info = [] device_info.append(self.parent().rnetFailInfo[0]) device_info.append(self.parent().rnetFailInfo[1]) device_info.append(self.parent().rnetFailInfo[2]) device_info.append(self.parent().rnetFailInfo[3]) self.parent().TableAddItem(device_info, False) # 添加PASS数据 self.test_result_signal.emit((device_info,False)) # 端口数 self.parent().lbl_GetPortNum.setText(str(self.parent().rnetTestCount+1)) # 设置测试端口数 self.parent().lbl_GetPortNum.setStyleSheet("background-color: red;") # 后置端口背景色设置为浅绿色 # 连接状态 self.parent().lbl_GetConntion.setText(self.parent().rnetFailInfo[1]) # 设置连接状态 self.parent().lbl_GetConntion.setStyleSheet("background-color: red;") # 后置端口背景色设置为浅绿色 # 速率 self.parent().lbl_GetRate.setText(self.parent().rnetFailInfo[2] + 'M') self.parent().lbl_GetRate.setStyleSheet("background-color: red;") # 后置端口背景色设置为浅绿色 self.parent().lbl_Result.setStyleSheet("background-color: black; color: red;") self.parent().lbl_Result.setText("测试FAIL!!") self.finished_signal.emit() # 线程完成时发出信号 self.stop() def stop(self): self.is_running = False # 或者使用更安全的停止逻辑 class Ui_Form(QWidget): updateTimer=pyqtSignal(bool)#时间线程启动器 def __init__(self): super().__init__() self.finished_threads = 0 # 用于跟踪完成的线程数 self.analysis_threads = [] # 存储所有的 AnalysisThread 实例 self.Err=''#错误信息 self.config = configparser.ConfigParser() # 创建对象 self.itemName = '' # 项目名称 self.testArgs = [] # 测试参数信息 self.testStandardArgs = '' # 测试准标参数 #参数信息 self.anetTestCount=1#网卡测试端口数 self.anetRate=[]#网卡速率 #读取的网卡信息 self.rnetTestCount=0#网卡测试端口数 self.rnetPortName=[]#获取所有网络接口名称 self.rnetRate=[]#网卡速率 self.rnetMacAddress=[]#网卡MACAddress self.rnConnetcion=[]#连接状态 self.rnetFailInfo=[]#读取的fail信息 # 生成日志信息 self.logger = logging.getLogger('my_logger') # 步骤1 创建日志记录器 self.logger.setLevel(logging.DEBUG) # 步骤2 将指定日志级别 self.file_handler = logging.FileHandler('./log/log.txt') # 步骤3 创建文件处理器 self.formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') # 步骤4 创建格式化器 self.file_handler.setFormatter(self.formatter) # 步骤4 将格式化器添加到处理器 self.logger.addHandler(self.file_handler) # 步骤5 将处理器添加到日志记录器 # 读取配置 self.config.read('./Conf/config.conf', encoding='utf-8') # 读取配置文件,如果配置文件不存在则创建 # 读取测试配置 self.itemName = self.config.get('TestItemNameArrays', 'NetOpening') # 项目名称 self.itemFailSleepExit = int(self.config.get('TestItemWinFrmSleepExit', 'NetOpening')) # 项目测试Fail延时退出 self.testArgs = self.ReadJsonInfo('./Conf/TestArgs.json') # 读取测试参数信息 if self.ReadJsonTestArgs(self.itemName)==True:#获取标准参数 testArgs=[]#测试参数 testArgs=self.testStandardArgs.split('|') testCount=testArgs[0]#测试端口数 netRate=testArgs[1]#测试速率 self.anetTestCount=int(testCount[testCount.find('=')+1:]) self.anetRate=netRate[netRate.find('=')+1:].split(',')#截取速率信息 self.setupUi()#初始化 self.lbl_Result.setStyleSheet("background-color: black; color: red;") self.rnetPortName=self.get_network_interfaces() for rn in self.rnetPortName: if 'lo' in rn: self.rnetPortName.remove(rn) break if len(self.rnetPortName)!=self.anetTestCount:#获取测试接口信息 self.lbl_GetPortNum.setText(str(len(self.rnetPortName))) self.lbl_GetPortNum.setStyleSheet("color: red;") self.lbl_Result.setStyleSheet("background-color: black; color: red;") self.ShowLog(f"侦测试网络适配器数量与参数不匹配 Err:{self.rnetPortName}", False) self.Err=f"侦测试网络适配器数量与参数不匹配 Err:{self.rnetPortName}"; # 创建一个定时器来检查视频是否播放结束 self.timer = QTimer(self) self.timer.setInterval(1000) # 每秒检查一次 self.timer.timeout.connect(self.check_Test) self.timer.start() # 连接信号到槽 self.updateTimer.connect(self.handleTimer) #获取所有网络接口名称 def get_network_interfaces(self): return list(psutil.net_if_addrs().keys()) def get_net_interfaces(self): net_if_addrs = psutil.net_if_addrs() return net_if_addrs #获取端口信息及测试 interface_name:适配置器名称 def GetTestPortInfoAndTest(self,interface_name): try: self.rnetFailInfo.clear()#清空fail信息 testdata=self.get_interface_details(interface_name) self.label_2.setText(f'当前{interface_name} 端口测试..') if self.Err is None: self.lbl_Result.setStyleSheet("background-color: black; color: lightyellow;") self.lbl_Result.setText("测试中..") else: self.lbl_Result.setStyleSheet("background-color: black; color: red;") self.lbl_Result.setText(self.Err) if testdata and testdata['speed'] and testdata['operstate'] and testdata['mac_address']: if int(self.anetRate[self.rnetTestCount])==int(testdata['speed']): self.rnetMacAddress.append(testdata['mac_address']) self.rnetRate.append(testdata['speed']) self.rnConnetcion.append(testdata['operstate']) self.rnetTestCount+=1 return True else: self.rnetFailInfo.append(interface_name) self.rnetFailInfo.append(testdata['operstate']) self.rnetFailInfo.append(testdata['speed']) self.rnetFailInfo.append(testdata['mac_address']) return False else: return False except Exception as e: self.ShowLog(f"GetTestPortInfoAndTest Err:{e}", False) return False def read_sys_file(self,path): try: with open(path, 'r') as file: return file.read().strip() except IOError: return None def get_interface_details(self,interface): speed = self.read_sys_file(f'/sys/class/net/{interface}/speed') operstate = self.read_sys_file(f'/sys/class/net/{interface}/operstate') mac_address = self.read_sys_file(f'/sys/class/net/{interface}/address') return { 'speed': speed, 'operstate': operstate, 'mac_address': mac_address } # 定义触发器 def handleTimer(self, start): if start: self.timer.start() else: self.timer.stop() # 启动多线程 def start_analysis_threads(self): # 创建多个线程 self.finished_threads = 0 # 重置计数器 self.analysis_threads = [] # 重置线程列表 print("Remaining devices to test:", self.rnetPortName) # 打印剩余的设备列表 #self.threads = [] for portname in self.rnetPortName: thread=AnalysisThread(portname,'lan',self) thread.test_result_signal.connect(self.handle_test_result) # 连接信号 thread.finished_signal.connect(self.thread_finished) thread.start() #self.threads.append(thread) self.analysis_threads.append(thread) # 判断是否所有线程都执行完成 def thread_finished(self): self.finished_threads += 1 if self.finished_threads == len(self.analysis_threads): self.updateTimer.emit(True) # 所有线程完成后重新启动定时器 # def handle_test_result(self, result): devicepath, isPass = result if isPass: # 如果测试通过,从待测试列表中移除该设备 if devicepath in self.rnetPortName: self.rnetPortName.remove(devicepath) self.TableAddItem(devicepath, isPass) # 校验是否完成测试 def check_Test(self): if self.anetTestCount==self.rnetTestCount: macinfo=''#mac信息 rate=''#速率 for mac in self.rnetMacAddress: macinfo+=mac+',' macinfo=macinfo[:-1] #去掉最后一个字符 for rte in self.anetRate: rate+=rte+',' rate=rate[:-1]#去掉最后一个字符 self.UpdateJsonTestArgs(self.itemName,f'PortNum={self.anetTestCount}|MAC={macinfo}|Rate={rate}','PASS') self.lbl_Result.setStyleSheet("background-color: black; color: green;") self.lbl_Result.setText("测试PASS!!") sys.exit(0) elif self.finished_threads < len(self.analysis_threads): # 等待所有线程完成 pass else: self.updateTimer.emit(False) # 重新启动定时器 self.start_analysis_threads() def setupUi(self): self.setObjectName("Form") self.resize(1006, 800) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("IMAGE/lan.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.setWindowIcon(icon) self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.lbl_Logo = QtWidgets.QLabel(self) self.lbl_Logo.setText("") self.lbl_Logo.setPixmap(QtGui.QPixmap("IMAGE/logo.jpg")) self.lbl_Logo.setAlignment(QtCore.Qt.AlignCenter) self.lbl_Logo.setObjectName("lbl_Logo") self.horizontalLayout_6.addWidget(self.lbl_Logo) self.label_3 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.label_3.setFont(font) self.label_3.setStyleSheet("color: rgb(255, 255, 255);\n" "background-color: rgb(170, 170, 127);") self.label_3.setAlignment(QtCore.Qt.AlignCenter) self.label_3.setObjectName("label_3") self.horizontalLayout_6.addWidget(self.label_3) self.verticalLayout_2.addLayout(self.horizontalLayout_6) self.label_2 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(14) self.label_2.setFont(font) self.label_2.setStyleSheet("background-color: rgb(85, 255, 127);") self.label_2.setAlignment(QtCore.Qt.AlignCenter) self.label_2.setObjectName("label_2") self.verticalLayout_2.addWidget(self.label_2) self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.horizontalLayout.addLayout(self.horizontalLayout_2) self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.label_7 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.label_7.setFont(font) self.label_7.setStyleSheet("background-color: rgb(170, 170, 127);\n" "color: rgb(255, 255, 255);") self.label_7.setAlignment(QtCore.Qt.AlignCenter) self.label_7.setObjectName("label_7") self.horizontalLayout_3.addWidget(self.label_7) self.label_8 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.label_8.setFont(font) self.label_8.setStyleSheet("background-color: rgb(85, 170, 127);\n" "color: rgb(255, 255, 255);") self.label_8.setAlignment(QtCore.Qt.AlignCenter) self.label_8.setObjectName("label_8") self.horizontalLayout_3.addWidget(self.label_8) self.label_6 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.label_6.setFont(font) self.label_6.setStyleSheet("background-color: rgb(170, 255, 127);\n" "color: rgb(255, 255, 255);") self.label_6.setAlignment(QtCore.Qt.AlignCenter) self.label_6.setObjectName("label_6") self.horizontalLayout_3.addWidget(self.label_6) self.label_5 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.label_5.setFont(font) self.label_5.setStyleSheet("background-color: rgb(255, 170, 0);\n" "color: rgb(255, 255, 255);") self.label_5.setAlignment(QtCore.Qt.AlignCenter) self.label_5.setObjectName("label_5") self.horizontalLayout_3.addWidget(self.label_5) self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.label_10 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.label_10.setFont(font) self.label_10.setAlignment(QtCore.Qt.AlignCenter) self.label_10.setObjectName("label_10") self.horizontalLayout_4.addWidget(self.label_10) self.lbl_SetPortNum = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.lbl_SetPortNum.setFont(font) self.lbl_SetPortNum.setAlignment(QtCore.Qt.AlignCenter) self.lbl_SetPortNum.setObjectName("lbl_SetPortNum") self.horizontalLayout_4.addWidget(self.lbl_SetPortNum) self.lbl_SetConntion = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.lbl_SetConntion.setFont(font) self.lbl_SetConntion.setAlignment(QtCore.Qt.AlignCenter) self.lbl_SetConntion.setObjectName("lbl_SetConntion") self.horizontalLayout_4.addWidget(self.lbl_SetConntion) self.lbl_SetRate = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.lbl_SetRate.setFont(font) self.lbl_SetRate.setAlignment(QtCore.Qt.AlignCenter) self.lbl_SetRate.setObjectName("lbl_SetRate") self.horizontalLayout_4.addWidget(self.lbl_SetRate) self.verticalLayout_3.addLayout(self.horizontalLayout_4) self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.label_12 = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.label_12.setFont(font) self.label_12.setAlignment(QtCore.Qt.AlignCenter) self.label_12.setObjectName("label_12") self.horizontalLayout_5.addWidget(self.label_12) self.lbl_GetPortNum = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.lbl_GetPortNum.setFont(font) self.lbl_GetPortNum.setAlignment(QtCore.Qt.AlignCenter) self.lbl_GetPortNum.setObjectName("lbl_GetPortNum") self.horizontalLayout_5.addWidget(self.lbl_GetPortNum) self.lbl_GetConntion = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.lbl_GetConntion.setFont(font) self.lbl_GetConntion.setAlignment(QtCore.Qt.AlignCenter) self.lbl_GetConntion.setObjectName("lbl_GetConntion") self.horizontalLayout_5.addWidget(self.lbl_GetConntion) self.lbl_GetRate = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(12) self.lbl_GetRate.setFont(font) self.lbl_GetRate.setAlignment(QtCore.Qt.AlignCenter) self.lbl_GetRate.setObjectName("lbl_GetRate") self.horizontalLayout_5.addWidget(self.lbl_GetRate) self.verticalLayout_3.addLayout(self.horizontalLayout_5) self.horizontalLayout.addLayout(self.verticalLayout_3) self.verticalLayout.addLayout(self.horizontalLayout) self.tableWidget = QtWidgets.QTableWidget(self) font = QtGui.QFont() font.setPointSize(12) self.tableWidget.setFont(font) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(6) self.tableWidget.setRowCount(0) # 初始化表格行数为0 self.tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) item = QtWidgets.QTableWidgetItem() item.setTextAlignment(QtCore.Qt.AlignCenter) font = QtGui.QFont() font.setPointSize(12) item.setFont(font) item.setBackground(QtGui.QColor(170, 170, 127)) self.tableWidget.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() item.setTextAlignment(QtCore.Qt.AlignCenter) font = QtGui.QFont() font.setPointSize(12) item.setFont(font) item.setBackground(QtGui.QColor(0, 170, 127)) self.tableWidget.setHorizontalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() item.setTextAlignment(QtCore.Qt.AlignCenter) font = QtGui.QFont() font.setPointSize(12) item.setFont(font) item.setBackground(QtGui.QColor(170, 255, 127)) self.tableWidget.setHorizontalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() item.setTextAlignment(QtCore.Qt.AlignCenter) font = QtGui.QFont() font.setPointSize(12) item.setFont(font) item.setBackground(QtGui.QColor(255, 170, 127)) self.tableWidget.setHorizontalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() item.setTextAlignment(QtCore.Qt.AlignCenter) font = QtGui.QFont() font.setPointSize(12) item.setFont(font) item.setBackground(QtGui.QColor(85, 255, 127)) self.tableWidget.setHorizontalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() item.setTextAlignment(QtCore.Qt.AlignCenter) font = QtGui.QFont() font.setPointSize(12) item.setFont(font) item.setBackground(QtGui.QColor(85, 255, 0)) self.tableWidget.setHorizontalHeaderItem(5, item) self.verticalLayout.addWidget(self.tableWidget) self.lbl_Result = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(18) self.lbl_Result.setFont(font) self.lbl_Result.setStyleSheet("background-color: rgb(0, 0, 0);") self.lbl_Result.setAlignment(QtCore.Qt.AlignCenter) self.lbl_Result.setText("测试中..") self.lbl_Result.setObjectName("lbl_Result") self.verticalLayout.addWidget(self.lbl_Result) self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) self.lbl_Result.setStyleSheet("background-color: black; color: red;") self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowCloseButtonHint) # 只显示最小化按钮和关闭按钮 def retranslateUi(self): _translate = QtCore.QCoreApplication.translate self.setWindowTitle(_translate("Form", "LAN Test")) self.label_3.setText(_translate("Form", "控制过程")) self.label_2.setText(_translate("Form", "当前 Realtek PCIe GbE Family Controller测试..")) self.label_7.setText(_translate("Form", "测试参数名称")) self.label_8.setText(_translate("Form", "端口数")) self.label_6.setText(_translate("Form", "连接状态")) self.label_5.setText(_translate("Form", "测试速率")) self.label_10.setText(_translate("Form", "设置参数")) self.lbl_SetPortNum.setText(_translate("Form", str(self.anetTestCount))) self.lbl_SetConntion.setText(_translate("Form", "True")) self.lbl_SetRate.setText(_translate("Form", f'{str(self.anetRate[0])}M')) self.label_12.setText(_translate("Form", "当前测试状态")) self.lbl_GetPortNum.setText(_translate("Form", "N/A")) self.lbl_GetConntion.setText(_translate("Form", "N/A")) self.lbl_GetRate.setText(_translate("Form", "N/A")) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("Form", "NO")) item = self.tableWidget.horizontalHeaderItem(1) item.setText(_translate("Form", "项目名称")) item = self.tableWidget.horizontalHeaderItem(2) item.setText(_translate("Form", "连接状态")) item = self.tableWidget.horizontalHeaderItem(3) item.setText(_translate("Form", "速率")) item = self.tableWidget.horizontalHeaderItem(4) item.setText(_translate("Form", "MacAddress")) item = self.tableWidget.horizontalHeaderItem(5) item.setText(_translate("Form", "测试结果")) self.lbl_Result.setText(_translate("COMLPTTest", "测试中..")) self.tableWidget.setColumnWidth(0,60) self.tableWidget.setColumnWidth(1,140) self.tableWidget.setColumnWidth(2,140) self.tableWidget.setColumnWidth(3,140) self.tableWidget.setColumnWidth(4,280) self.tableWidget.setColumnWidth(5,200) self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 表格状态只读 self.tableWidget.clicked.connect(self.TestThread) # 表单,单击事件 #读取json信息 def ReadJsonInfo(self,fileName): try: if os.path.exists(fileName): f=open(fileName,'r',encoding='utf-8') return json.loads(f.read()) except Exception as e: self.ShowLog("Read "+fileName+" Err:" + str(e),False) sys.exit(1) # 读取项目参数信息,itemName:项目名称 def ReadJsonTestArgs(self, itemName): try: self.testArgs = self.ReadJsonInfo('./Conf/TestArgs.json') for js in self.testArgs: if itemName in js['ItemName']: self.testStandardArgs = js['Standard'] return True self.ShowLog('Read TestArgs.json ItemName:' + itemName + ' Info Is Empty!!', False) sys.exit(1) except Exception as e: self.ShowLog("Read TestArgs.json ItemName:" + itemName + " Info Err:" + str(e), False) sys.exit(1) #手动关闭窗口 def closeEvent(self, event): # 创建一个消息框,上面有两个按钮:“是”和“否” #reply = QMessageBox.question(self, '退出', "你确定要退出吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) # 如果用户点击了“是”,则执行event.accept()来关闭窗口 #if reply == QMessageBox.Yes: # event.accept() # sys.exit(1) #else: # 如果用户点击了“否”,则忽略event,不关闭窗口 # event.ignore() sys.exit(1) # 定义一个函数使得函数窗口居中显示 def Center(self): # 获取屏幕尺寸 screen_geometry = app.desktop().availableGeometry() # 计算窗口居中位置 x = (screen_geometry.width() - self.width()) // 2 y = (screen_geometry.height() - self.height()) // 2 # 设置窗口位置 self.move(x, y) # 打印的信息 def ShowLog(self, log, isPass): try: if isPass == True: self.lbl_Result.setStyleSheet("color:green;") self.logger.info(str(log)) self.lbl_Result.setText("TEST PASS") else: self.lbl_Result.setStyleSheet("color:red;") self.logger.error(str(log)) self.lbl_Result.setText(log) except Exception as e: print("\033[1;31m" + str(e) + " \033[0m") sys.exit(1) # 更新测试参数json,itemName:项目名称,readValue:读取值,testResult:测试结果 def UpdateJsonTestArgs(self, itemName, readValue, testResult): try: updateTestArgs = [] # 更新的测试参数 self.testArgs = self.ReadJsonInfo('./Conf/TestArgs.json') for js in self.testArgs: if itemName in js['ItemName']: js['Read'] = readValue # 读取的值 js['TestResult'] = testResult # 测试结果 updateTestArgs.append(js) else: updateTestArgs.append(js) with open("./Conf/TestArgs.json", "w") as write_file: json.dump(updateTestArgs, write_file) return True except Exception as e: self.ShowLog("Read TestArgs.json ItemName:" + itemName + " Info Err:" + str(e), False) sys.exit(1) # def TableAddItem(self, port, isPass): # # 检查设备是否已经在表格中 # for rowIndex in range(self.tableWidget.rowCount()): # print('port',port) # if self.tableWidget.item(rowIndex, 1) and self.tableWidget.item(rowIndex, 2): # if self.tableWidget.item(rowIndex, 1).text() == port[0] and self.tableWidget.item(rowIndex, 2).text() == port[1] and self.tableWidget.item(rowIndex,3).text()==port[2]: # # 更新现有行的测试结果 # testResult = 'PASS' if isPass else 'FAIL' # self.tableWidget.item(rowIndex, 4).setText(testResult) # if testResult == 'PASS': # self.tableWidget.item(rowIndex, 4).setForeground(QtGui.QColor(51, 204, 51)) # else: # self.tableWidget.item(rowIndex, 4).setForeground(QtGui.QColor(255, 51, 51)) # return def TableAddItem(self, port, isPass): # 检查设备是否已经在表格中 rowToUpdate = None print('self.tableWidget.rowCount()',self.tableWidget.rowCount()) for rowIndex in range(self.tableWidget.rowCount()): if self.tableWidget.item(rowIndex, 1) and self.tableWidget.item(rowIndex, 2): if self.tableWidget.item(rowIndex, 1).text() == port[0] and self.tableWidget.item(rowIndex, 2).text() == \ port[1]: rowToUpdate = rowIndex break if rowToUpdate is not None: # 更新现有行 testResult = 'PASS' if isPass else 'FAIL' self.tableWidget.item(rowToUpdate, 5).setText(testResult) if testResult == 'PASS': self.tableWidget.item(rowToUpdate, 5).setForeground(QtGui.QColor(51, 204, 51)) else: self.tableWidget.item(rowToUpdate, 5).setForeground(QtGui.QColor(255, 51, 51)) else: # 添加新行 newRow = self.tableWidget.rowCount() self.tableWidget.insertRow(newRow) self.tableWidget.setRowCount(newRow + 1) # 增加表格行数 # ... 添加数据到新行 ... # 添加数据到新行 self.tableWidget.setItem(newRow, 0, QTableWidgetItem(str(newRow + 1))) self.tableWidget.setItem(newRow, 1, QTableWidgetItem(port[0])) self.tableWidget.setItem(newRow, 2, QTableWidgetItem(port[1])) self.tableWidget.setItem(newRow, 3, QTableWidgetItem(port[2])) self.tableWidget.setItem(newRow, 4, QTableWidgetItem(port[3])) testResult = 'PASS' if isPass else 'FAIL' resultItem = QTableWidgetItem(testResult) resultItem.setTextAlignment(Qt.AlignCenter) self.tableWidget.setItem(newRow, 5, resultItem) if testResult == 'PASS': resultItem.setForeground(QtGui.QColor(51, 204, 51)) else: resultItem.setForeground(QtGui.QColor(255, 51, 51)) #启动线重脚本 def TestThread(self): pass #self.t_autoplay=Thread(target=self.Test) #self.t_autoplay.start() if __name__=='__main__': app=QApplication(sys.argv) win=Ui_Form() win.Center() # 居中 win.show() sys.exit(app.exec_())
到此这篇关于Python+PyQt5实现网口功能测试详解的文章就介绍到这了,更多相关Python网口功能测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!