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 pyserialclass 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 = devicepathself.type = typeself.is_running = Truedef run(self):result = Falseindex=0if self.parent().rnetTestCount>0:index=self.parent().rnetTestCount-1result = 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])#MacAddressself.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=[]#网卡MACAddressself.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)breakif 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+=1return Trueelse:self.rnetFailInfo.append(interface_name)self.rnetFailInfo.append(testdata['operstate'])self.rnetFailInfo.append(testdata['speed'])self.rnetFailInfo.append(testdata['mac_address'])return Falseelse:return Falseexcept Exception as e:self.ShowLog(f"GetTestPortInfoAndTest Err:{e}", False)return Falsedef read_sys_file(self,path):try:with open(path, 'r') as file:return file.read().strip()except IOError:return Nonedef 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 += 1if self.finished_threads == len(self.analysis_threads):self.updateTimer.emit(True)  # 所有线程完成后重新启动定时器#def handle_test_result(self, result):devicepath, isPass = resultif 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):# 等待所有线程完成passelse: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)  # 初始化表格行数为0self.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.translateself.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 Trueself.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()) // 2y = (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 Trueexcept 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))#                 returndef TableAddItem(self, port, isPass):# 检查设备是否已经在表格中rowToUpdate = Noneprint('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 = rowIndexbreakif 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_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/423100.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud alibaba sentinel熔断降级

简介 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 sentinel相当于hystrix的升级版&#xff0c;加入了web界面&#xff0c;能够实时在线的改变流…

Spring Security 之 用户名/密码认证

用户名/密码 验证用户身份的最常见方式之一是验证用户名和密码。Spring Security提供了全面的支持,用于使用用户名和密码进行身份验证。 您可以使用以下方式配置用户名和密码身份验证: @Configuration @EnableWebSecurity public class SecurityConfig {@Beanpublic Secur…

Excel象限图

Excel象限图 1、背景描述2、象限图&#xff08;散点图&#xff09;3、象限图&#xff08;气泡图&#xff09; 1、背景描述 平常我们在工作中做图表时&#xff0c;使用最多的就是柱状形、折线图、饼图&#xff0c;这些图表主要为了展示趋势、对比和构成&#xff0c;但有时候我们…

LeetCode 48 旋转图像

题目描述 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4…

怎么检查直线模组的故障?

直线模组可谓是自动化设备中不可或缺的一部分&#xff0c;在自动化设备运行过程中&#xff0c;如果发生直线模组报警故障&#xff0c;往往会导致自动化生产线停下来&#xff0c;造成产量的减少&#xff0c;所以检查直线模组的故障很重要&#xff01; 1、检查外观是否有明显的磨…

8.5跳跃游戏(LC55-M)

算法&#xff1a; 其实跳几步无所谓&#xff0c;关键在于可跳的覆盖范围&#xff01; 不一定非要明确一次究竟跳几步&#xff0c;每次取最大的跳跃步数&#xff0c;这个就是可以跳跃的覆盖范围。 这个范围内&#xff0c;别管是怎么跳的&#xff0c;反正一定可以跳过来。 那…

知识笔记(九十五)———Vue中的导航守卫

直白的说&#xff0c;导航守卫就是路由跳转过程中的一些钩子函数&#xff0c;这些函数能让你在跳转过程中操作一些其他的事儿的时机&#xff0c;这就是导航守卫。 比如最常见的登录权限验证&#xff0c;当用户满足条件时&#xff0c;才让其进入导航&#xff0c;否则就取消跳转…

恒创科技:云服务器配置中的vCPU与物理CPU有啥区别?

​  说到云服务器&#xff0c;您可能经常会遇到vCPU这个词&#xff0c;而且它和物理CPU经常被拿来谈论。尽管它们听起来相似&#xff0c;但两者之间存在显著差异。在本文中&#xff0c;我们将详细讨论云vCPU和物理CPU之间的差异。 物理与虚拟 CPU 和 vCPU 之间最显著的区别在…

游戏渲染管道

高级的渲染步骤是由管道&#xff08;软件架构&#xff09;实现&#xff0c;各个阶段会操作输入流中的数据项&#xff0c;并对输出流产生数据。 管道每个阶段独立于其他阶段&#xff0c;所以管道的最大有点在于非常适合并行化。 渲染管道分为3个概要阶段。但在这里多讲几个阶段…

Maven《四》-- 基于Idea进行Maven工程构建

目录 &#x1f436;4.1 构建概念和构建过程 &#x1f436;4.2 命令方式项目构建 1. &#x1f959;编译&#xff1a;mvn compile 2. &#x1f959;清理&#xff1a;mvn clean 3. &#x1f959;打包&#xff1a;mvn package 4. &#x1f959;安装&#xff1a;mvn install …

第二节 K8S 的架构

第二节 K8S 的架构 K8S 架构图如下: 官方文档: https://kubernetes.io/docs/concepts/architecture/ kube-api-server 是集群的核心&#xff0c; 是k8s中最重要的组件&#xff0c; 因为它是实现声明式api的关键, 整个集群的入口,所有请求都要经过它, api接口服务. kubernetes…

制造业管理软件:为何ERP替代不了MES?

一、ERP和MES的功能区别 ERP是一种综合性的企业管理软件&#xff0c;它涵盖了企业的各个方面&#xff0c;包括财务、采购、库存、销售、人力资源等。它的主要功能是将企业内部的各项业务整合为一个整体进行管理&#xff0c;实现信息共享和协同工作。ERP的主要特点是可以对企业…