Python+PyQt5實(shí)現(xiàn)網(wǎng)口功能測(cè)試詳解
UI界面:

實(shí)現(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) # 新增信號(hào),傳遞一個(gè)包含設(shè)備路徑和測(cè)試結(jié)果的元組
finished_signal = QtCore.pyqtSignal() # 新增信號(hào),表示線程完成
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è)置測(cè)試端口數(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è)置測(cè)試端口數(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("測(cè)試FAIL!!")
self.finished_signal.emit() # 線程完成時(shí)發(fā)出信號(hào)
self.stop()
def stop(self):
self.is_running = False # 或者使用更安全的停止邏輯
class Ui_Form(QWidget):
updateTimer=pyqtSignal(bool)#時(shí)間線程啟動(dòng)器
def __init__(self):
super().__init__()
self.finished_threads = 0 # 用于跟蹤完成的線程數(shù)
self.analysis_threads = [] # 存儲(chǔ)所有的 AnalysisThread 實(shí)例
self.Err=''#錯(cuò)誤信息
self.config = configparser.ConfigParser() # 創(chuàng)建對(duì)象
self.itemName = '' # 項(xiàng)目名稱
self.testArgs = [] # 測(cè)試參數(shù)信息
self.testStandardArgs = '' # 測(cè)試準(zhǔn)標(biāo)參數(shù)
#參數(shù)信息
self.anetTestCount=1#網(wǎng)卡測(cè)試端口數(shù)
self.anetRate=[]#網(wǎng)卡速率
#讀取的網(wǎng)卡信息
self.rnetTestCount=0#網(wǎng)卡測(cè)試端口數(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 將指定日志級(jí)別
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)建
# 讀取測(cè)試配置
self.itemName = self.config.get('TestItemNameArrays', 'NetOpening') # 項(xiàng)目名稱
self.itemFailSleepExit = int(self.config.get('TestItemWinFrmSleepExit', 'NetOpening')) # 項(xiàng)目測(cè)試Fail延時(shí)退出
self.testArgs = self.ReadJsonInfo('./Conf/TestArgs.json') # 讀取測(cè)試參數(shù)信息
if self.ReadJsonTestArgs(self.itemName)==True:#獲取標(biāo)準(zhǔn)參數(shù)
testArgs=[]#測(cè)試參數(shù)
testArgs=self.testStandardArgs.split('|')
testCount=testArgs[0]#測(cè)試端口數(shù)
netRate=testArgs[1]#測(cè)試速率
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:#獲取測(cè)試接口信息
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"偵測(cè)試網(wǎng)絡(luò)適配器數(shù)量與參數(shù)不匹配 Err:{self.rnetPortName}", False)
self.Err=f"偵測(cè)試網(wǎng)絡(luò)適配器數(shù)量與參數(shù)不匹配 Err:{self.rnetPortName}";
# 創(chuàng)建一個(gè)定時(shí)器來檢查視頻是否播放結(jié)束
self.timer = QTimer(self)
self.timer.setInterval(1000) # 每秒檢查一次
self.timer.timeout.connect(self.check_Test)
self.timer.start()
# 連接信號(hào)到槽
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
#獲取端口信息及測(cè)試 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} 端口測(cè)試..')
if self.Err is None:
self.lbl_Result.setStyleSheet("background-color: black; color: lightyellow;")
self.lbl_Result.setText("測(cè)試中..")
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()
# 啟動(dòng)多線程
def start_analysis_threads(self):
# 創(chuàng)建多個(gè)線程
self.finished_threads = 0 # 重置計(jì)數(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) # 連接信號(hào)
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) # 所有線程完成后重新啟動(dòng)定時(shí)器
#
def handle_test_result(self, result):
devicepath, isPass = result
if isPass:
# 如果測(cè)試通過,從待測(cè)試列表中移除該設(shè)備
if devicepath in self.rnetPortName:
self.rnetPortName.remove(devicepath)
self.TableAddItem(devicepath, isPass)
# 校驗(yàn)是否完成測(cè)試
def check_Test(self):
if self.anetTestCount==self.rnetTestCount:
macinfo=''#mac信息
rate=''#速率
for mac in self.rnetMacAddress:
macinfo+=mac+','
macinfo=macinfo[:-1] #去掉最后一個(gè)字符
for rte in self.anetRate:
rate+=rte+','
rate=rate[:-1]#去掉最后一個(gè)字符
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("測(cè)試PASS!!")
sys.exit(0)
elif self.finished_threads < len(self.analysis_threads):
# 等待所有線程完成
pass
else:
self.updateTimer.emit(False) # 重新啟動(dòng)定時(shí)器
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("測(cè)試中..")
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測(cè)試.."))
self.label_7.setText(_translate("Form", "測(cè)試參數(shù)名稱"))
self.label_8.setText(_translate("Form", "端口數(shù)"))
self.label_6.setText(_translate("Form", "連接狀態(tài)"))
self.label_5.setText(_translate("Form", "測(cè)試速率"))
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)前測(cè)試狀態(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", "項(xiàng)目名稱"))
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", "測(cè)試結(jié)果"))
self.lbl_Result.setText(_translate("COMLPTTest", "測(cè)試中.."))
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)
# 讀取項(xiàng)目參數(shù)信息,itemName:項(xiàng)目名稱
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)
#手動(dòng)關(guān)閉窗口
def closeEvent(self, event):
# 創(chuàng)建一個(gè)消息框,上面有兩個(gè)按鈕:“是”和“否”
#reply = QMessageBox.question(self, '退出', "你確定要退出嗎?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
# 如果用戶點(diǎn)擊了“是”,則執(zhí)行event.accept()來關(guān)閉窗口
#if reply == QMessageBox.Yes:
# event.accept()
# sys.exit(1)
#else:
# 如果用戶點(diǎn)擊了“否”,則忽略event,不關(guān)閉窗口
# event.ignore()
sys.exit(1)
# 定義一個(gè)函數(shù)使得函數(shù)窗口居中顯示
def Center(self):
# 獲取屏幕尺寸
screen_geometry = app.desktop().availableGeometry()
# 計(jì)算窗口居中位置
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)
# 更新測(cè)試參數(shù)json,itemName:項(xiàng)目名稱,readValue:讀取值,testResult:測(cè)試結(jié)果
def UpdateJsonTestArgs(self, itemName, readValue, testResult):
try:
updateTestArgs = [] # 更新的測(cè)試參數(shù)
self.testArgs = self.ReadJsonInfo('./Conf/TestArgs.json')
for js in self.testArgs:
if itemName in js['ItemName']:
js['Read'] = readValue # 讀取的值
js['TestResult'] = testResult # 測(cè)試結(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)有行的測(cè)試結(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))
#啟動(dòng)線重腳本
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實(shí)現(xiàn)網(wǎng)口功能測(cè)試詳解的文章就介紹到這了,更多相關(guān)Python網(wǎng)口功能測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文弄懂Pytorch的DataLoader, DataSet, Sampler之間的關(guān)系
這篇文章主要介紹了一文弄懂Pytorch的DataLoader, DataSet, Sampler之間的關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Python實(shí)現(xiàn)的遠(yuǎn)程文件自動(dòng)打包并下載功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的遠(yuǎn)程文件自動(dòng)打包并下載功能,結(jié)合實(shí)例形式分析了Python使用spawn()方法執(zhí)行ssh、scp 命令實(shí)現(xiàn)遠(yuǎn)程文件的相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
Python?Pyecharts繪制?;鶊D分析用戶行為路徑
這篇文章主要為大家介紹了Python?Pyecharts繪制桑基圖分析用戶行為路徑,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python機(jī)器學(xué)習(xí)之決策樹算法實(shí)例詳解
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)之決策樹算法,較為詳細(xì)的分析了實(shí)例詳解機(jī)器學(xué)習(xí)中決策樹算法的概念、原理及相關(guān)Python實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
Matplotlib與NumPy結(jié)合使用技術(shù)代碼和案例詳解
這篇文章主要介紹了Matplotlib和NumPy的基本使用方法,并通過一些具體的案例展示了如何將它們結(jié)合使用來處理和可視化數(shù)據(jù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12

