Python+PyQt5實現(xiàn)網(wǎng)口功能測試詳解
更新時間:2024年02月19日 16:10:03 作者:漂泊_人生
這篇文章主要為大家詳細(xì)介紹了Python+PyQt5實現(xiàn)網(wǎng)口功能測試的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
UI界面:
實現(xiàn)代碼
# -*- 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#正則表達(dá)式 #pip install pyserial class AnalysisThread(QtCore.QThread): test_result_signal = QtCore.pyqtSignal(tuple) # 新增信號,傳遞一個包含設(shè)備路徑和測試結(jié)果的元組 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)#連接狀態(tài) device_info.append(self.parent().rnConnetcion[index])#連接狀態(tài) device_info.append(self.parent().rnetRate[index])#速率 device_info.append(self.parent().rnetMacAddress[index])#MacAddress self.parent().TableAddItem(device_info,True)#添加PASS數(shù)據(jù) #端口數(shù) self.parent().lbl_GetPortNum.setText(str(self.parent().rnetTestCount))#設(shè)置測試端口數(shù) self.parent().lbl_GetPortNum.setStyleSheet("background-color: lightgreen;") # 后置端口背景色設(shè)置為淺綠色 #連接狀態(tài) self.parent().lbl_GetConntion.setText(self.parent().rnConnetcion[index])#設(shè)置連接狀態(tài) self.parent().lbl_GetPortNum.setStyleSheet("background-color: lightgreen;") # 后置端口背景色設(shè)置為淺綠色 #速率 self.parent().lbl_GetRate.setText(self.parent().rnetRate[index]+'M') self.parent().lbl_GetRate.setStyleSheet("background-color: lightgreen;") # 后置端口背景色設(shè)置為淺綠色 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數(shù)據(jù) self.test_result_signal.emit((device_info,False)) # 端口數(shù) self.parent().lbl_GetPortNum.setText(str(self.parent().rnetTestCount+1)) # 設(shè)置測試端口數(shù) self.parent().lbl_GetPortNum.setStyleSheet("background-color: red;") # 后置端口背景色設(shè)置為淺綠色 # 連接狀態(tài) self.parent().lbl_GetConntion.setText(self.parent().rnetFailInfo[1]) # 設(shè)置連接狀態(tài) self.parent().lbl_GetConntion.setStyleSheet("background-color: red;") # 后置端口背景色設(shè)置為淺綠色 # 速率 self.parent().lbl_GetRate.setText(self.parent().rnetFailInfo[2] + 'M') self.parent().lbl_GetRate.setStyleSheet("background-color: red;") # 后置端口背景色設(shè)置為淺綠色 self.parent().lbl_Result.setStyleSheet("background-color: black; color: red;") self.parent().lbl_Result.setText("測試FAIL!!") self.finished_signal.emit() # 線程完成時發(fā)出信號 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 # 用于跟蹤完成的線程數(shù) self.analysis_threads = [] # 存儲所有的 AnalysisThread 實例 self.Err=''#錯誤信息 self.config = configparser.ConfigParser() # 創(chuàng)建對象 self.itemName = '' # 項目名稱 self.testArgs = [] # 測試參數(shù)信息 self.testStandardArgs = '' # 測試準(zhǔn)標(biāo)參數(shù) #參數(shù)信息 self.anetTestCount=1#網(wǎng)卡測試端口數(shù) self.anetRate=[]#網(wǎng)卡速率 #讀取的網(wǎng)卡信息 self.rnetTestCount=0#網(wǎng)卡測試端口數(shù) self.rnetPortName=[]#獲取所有網(wǎng)絡(luò)接口名稱 self.rnetRate=[]#網(wǎng)卡速率 self.rnetMacAddress=[]#網(wǎng)卡MACAddress self.rnConnetcion=[]#連接狀態(tài) self.rnetFailInfo=[]#讀取的fail信息 # 生成日志信息 self.logger = logging.getLogger('my_logger') # 步驟1 創(chuàng)建日志記錄器 self.logger.setLevel(logging.DEBUG) # 步驟2 將指定日志級別 self.file_handler = logging.FileHandler('./log/log.txt') # 步驟3 創(chuàng)建文件處理器 self.formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') # 步驟4 創(chuàng)建格式化器 self.file_handler.setFormatter(self.formatter) # 步驟4 將格式化器添加到處理器 self.logger.addHandler(self.file_handler) # 步驟5 將處理器添加到日志記錄器 # 讀取配置 self.config.read('./Conf/config.conf', encoding='utf-8') # 讀取配置文件,如果配置文件不存在則創(chuàng)建 # 讀取測試配置 self.itemName = self.config.get('TestItemNameArrays', 'NetOpening') # 項目名稱 self.itemFailSleepExit = int(self.config.get('TestItemWinFrmSleepExit', 'NetOpening')) # 項目測試Fail延時退出 self.testArgs = self.ReadJsonInfo('./Conf/TestArgs.json') # 讀取測試參數(shù)信息 if self.ReadJsonTestArgs(self.itemName)==True:#獲取標(biāo)準(zhǔn)參數(shù) testArgs=[]#測試參數(shù) testArgs=self.testStandardArgs.split('|') testCount=testArgs[0]#測試端口數(shù) 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"偵測試網(wǎng)絡(luò)適配器數(shù)量與參數(shù)不匹配 Err:{self.rnetPortName}", False) self.Err=f"偵測試網(wǎng)絡(luò)適配器數(shù)量與參數(shù)不匹配 Err:{self.rnetPortName}"; # 創(chuàng)建一個定時器來檢查視頻是否播放結(jié)束 self.timer = QTimer(self) self.timer.setInterval(1000) # 每秒檢查一次 self.timer.timeout.connect(self.check_Test) self.timer.start() # 連接信號到槽 self.updateTimer.connect(self.handleTimer) #獲取所有網(wǎng)絡(luò)接口名稱 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'當(dāng)前{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 } # 定義觸發(fā)器 def handleTimer(self, start): if start: self.timer.start() else: self.timer.stop() # 啟動多線程 def start_analysis_threads(self): # 創(chuàng)建多個線程 self.finished_threads = 0 # 重置計數(shù)器 self.analysis_threads = [] # 重置線程列表 print("Remaining devices to test:", self.rnetPortName) # 打印剩余的設(shè)備列表 #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) # 判斷是否所有線程都執(zhí)行完成 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: # 如果測試通過,從待測試列表中移除該設(shè)備 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) # 初始化表格行數(shù)為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) # 只顯示最小化按鈕和關(guān)閉按鈕 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", "當(dāng)前 Realtek PCIe GbE Family Controller測試..")) self.label_7.setText(_translate("Form", "測試參數(shù)名稱")) self.label_8.setText(_translate("Form", "端口數(shù)")) self.label_6.setText(_translate("Form", "連接狀態(tài)")) self.label_5.setText(_translate("Form", "測試速率")) self.label_10.setText(_translate("Form", "設(shè)置參數(shù)")) 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", "當(dāng)前測試狀態(tài)")) 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", "連接狀態(tài)")) 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", "測試結(jié)果")) 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) # 表格狀態(tài)只讀 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) # 讀取項目參數(shù)信息,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) #手動關(guān)閉窗口 def closeEvent(self, event): # 創(chuàng)建一個消息框,上面有兩個按鈕:“是”和“否” #reply = QMessageBox.question(self, '退出', "你確定要退出嗎?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) # 如果用戶點擊了“是”,則執(zhí)行event.accept()來關(guān)閉窗口 #if reply == QMessageBox.Yes: # event.accept() # sys.exit(1) #else: # 如果用戶點擊了“否”,則忽略event,不關(guān)閉窗口 # event.ignore() sys.exit(1) # 定義一個函數(shù)使得函數(shù)窗口居中顯示 def Center(self): # 獲取屏幕尺寸 screen_geometry = app.desktop().availableGeometry() # 計算窗口居中位置 x = (screen_geometry.width() - self.width()) // 2 y = (screen_geometry.height() - self.height()) // 2 # 設(shè)置窗口位置 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) # 更新測試參數(shù)json,itemName:項目名稱,readValue:讀取值,testResult:測試結(jié)果 def UpdateJsonTestArgs(self, itemName, readValue, testResult): try: updateTestArgs = [] # 更新的測試參數(shù) self.testArgs = self.ReadJsonInfo('./Conf/TestArgs.json') for js in self.testArgs: if itemName in js['ItemName']: js['Read'] = readValue # 讀取的值 js['TestResult'] = testResult # 測試結(jié)果 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): # # 檢查設(shè)備是否已經(jīng)在表格中 # 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]: # # 更新現(xiàn)有行的測試結(jié)果 # 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): # 檢查設(shè)備是否已經(jīng)在表格中 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: # 更新現(xiàn)有行 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) # 增加表格行數(shù) # ... 添加數(shù)據(jù)到新行 ... # 添加數(shù)據(jù)到新行 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_())
到此這篇關(guān)于Python+PyQt5實現(xiàn)網(wǎng)口功能測試詳解的文章就介紹到這了,更多相關(guān)Python網(wǎng)口功能測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文弄懂Pytorch的DataLoader, DataSet, Sampler之間的關(guān)系
這篇文章主要介紹了一文弄懂Pytorch的DataLoader, DataSet, Sampler之間的關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Python實現(xiàn)的遠(yuǎn)程文件自動打包并下載功能示例
這篇文章主要介紹了Python實現(xiàn)的遠(yuǎn)程文件自動打包并下載功能,結(jié)合實例形式分析了Python使用spawn()方法執(zhí)行ssh、scp 命令實現(xiàn)遠(yuǎn)程文件的相關(guān)操作技巧,需要的朋友可以參考下2019-07-07Python?Pyecharts繪制?;鶊D分析用戶行為路徑
這篇文章主要為大家介紹了Python?Pyecharts繪制?;鶊D分析用戶行為路徑,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Matplotlib與NumPy結(jié)合使用技術(shù)代碼和案例詳解
這篇文章主要介紹了Matplotlib和NumPy的基本使用方法,并通過一些具體的案例展示了如何將它們結(jié)合使用來處理和可視化數(shù)據(jù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12