feat: 增加伴生包加载器、manifest配置,Excel处理优化

This commit is contained in:
2026-07-21 16:26:16 +08:00
parent 45e4f1ecf2
commit 91bb61444e
19 changed files with 1364 additions and 82 deletions
+122
View File
@@ -0,0 +1,122 @@
import os
import logging
from PySide6.QtGui import *
from PySide6.QtCore import *
from PySide6.QtWidgets import *
logger = logging.getLogger(__name__)
from .mil_project_ui import Ui_FrameMILProject
from mil.core import Config
class MILProject(QFrame, Ui_FrameMILProject):
update_item_name_signal = Signal()
update_item_data_path_signal = Signal(str,str)
update_item_file_path_signal = Signal(str,str)
def __init__(self, config, name = None,parent = None):
super().__init__(parent)
self.setupUi(self)
self.initUI(config,name)
def initUI(self,config:Config, name:str):
self.lineEditDataPath.setReadOnly(True)
self.lineEditFilePath.setReadOnly(True)
self.name = name
self.config = config
self.ItemConfigs = config.ItemConfigs
if self.name is not None and self.name in self.ItemConfigs.keys():
self.lineEditName.setText(name)
self.lineEditDataPath.setText(self.ItemConfigs[self.name]["DataPath"])
self.lineEditFilePath.setText(self.ItemConfigs[self.name]["FilePath"])
else:
self.pushButtonDataPath.setEnabled(False)
self.pushButtonFilePath.setEnabled(False)
self.lineEditName.setPlaceholderText("必填项!!!")
self.lineEditDataPath.setPlaceholderText("点击【选择数据文件】按钮,选择路径!")
self.lineEditFilePath.setPlaceholderText("点击【选择测试用例】按钮,选择路径!")
self.lineEditName.editingFinished.connect(self.on_name_editing_finished_event)
self.lineEditDataPath.editingFinished.connect(self.on_datapath_editing_finished_event)
self.lineEditFilePath.editingFinished.connect(self.on_filepath_editing_finished_event)
self.pushButtonDataPath.clicked.connect(self.on_data_path_event)
self.pushButtonFilePath.clicked.connect(self.on_file_path_event)
def on_name_editing_finished_event(self):
name = self.lineEditName.text()
if name.replace(" ", "") == "":
self.lineEditName.setText(self.name)
logger.warning("项目名称是必填项!!!")
return
if name == self.name:
return
if self.name is None:
self.name = name
self.ItemConfigs[name] = dict()
self.ItemConfigs[name]["DataPath"] = ""
self.ItemConfigs[name]["FilePath"] = ""
else:
self.ItemConfigs[name] = self.ItemConfigs.pop(self.name)
if self.name == self.config.CurrProject:
self.config.CurrProject = name
self.name = name
self.config.save_config()
self.update_item_name_signal.emit()
self.pushButtonDataPath.setEnabled(True)
self.pushButtonFilePath.setEnabled(True)
def on_datapath_editing_finished_event(self):
name = self.lineEditName.text()
data_path = self.lineEditDataPath.text()
if data_path.replace(" ","") == "":
logger.warning("数据文件路径无效!")
return
self.ItemConfigs[name]["DataPath"] = data_path
self.config.save_config()
self.update_item_data_path_signal.emit(name,data_path)
def on_filepath_editing_finished_event(self):
name = self.lineEditName.text()
file_path = self.lineEditFilePath.text()
if file_path.replace(" ","") == "":
logger.warning("测试用例路径无效!")
return
self.ItemConfigs[name]["FilePath"] = file_path
self.config.save_config()
self.update_item_file_path_signal.emit(name,file_path)
def on_data_path_event(self):
dataPath = self.lineEditDataPath.text()
if os.path.exists(dataPath):
path,type = QFileDialog.getOpenFileName(self, "选择文件", dataPath,"Excel工作簿(*.xlsx)")
else:
path,type = QFileDialog.getOpenFileName(self, "选择文件", "./","Excel工作簿(*.xlsx)")
if not os.path.exists(path):
return
self.lineEditDataPath.setText(path)
self.on_datapath_editing_finished_event()
def on_file_path_event(self):
filePath = self.lineEditFilePath.text()
if os.path.exists(filePath):
path,type = QFileDialog.getOpenFileName(self, "选择文件", filePath,"Excel工作簿(*.xlsx)")
else:
path,type = QFileDialog.getOpenFileName(self, "选择文件", "./","Excel工作簿(*.xlsx)")
if not os.path.exists(path):
return
self.lineEditFilePath.setText(path)
self.on_filepath_editing_finished_event()
+2 -2
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FrameProject</class>
<widget class="QFrame" name="FrameProject">
<class>FrameMILProject</class>
<widget class="QFrame" name="FrameMILProject">
<property name="geometry">
<rect>
<x>0</x>
+23 -23
View File
@@ -18,26 +18,26 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QLabel,
QLineEdit, QPushButton, QSizePolicy, QWidget)
class Ui_FrameProject(object):
def setupUi(self, FrameProject):
if not FrameProject.objectName():
FrameProject.setObjectName(u"FrameProject")
FrameProject.resize(740, 95)
self.gridLayout_4 = QGridLayout(FrameProject)
class Ui_FrameMILProject(object):
def setupUi(self, FrameMILProject):
if not FrameMILProject.objectName():
FrameMILProject.setObjectName(u"FrameMILProject")
FrameMILProject.resize(740, 95)
self.gridLayout_4 = QGridLayout(FrameMILProject)
self.gridLayout_4.setObjectName(u"gridLayout_4")
self.gridLayout = QGridLayout()
self.gridLayout.setObjectName(u"gridLayout")
self.label = QLabel(FrameProject)
self.label = QLabel(FrameMILProject)
self.label.setObjectName(u"label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.label_2 = QLabel(FrameProject)
self.label_2 = QLabel(FrameMILProject)
self.label_2.setObjectName(u"label_2")
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
self.label_3 = QLabel(FrameProject)
self.label_3 = QLabel(FrameMILProject)
self.label_3.setObjectName(u"label_3")
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
@@ -47,7 +47,7 @@ class Ui_FrameProject(object):
self.gridLayout_2 = QGridLayout()
self.gridLayout_2.setObjectName(u"gridLayout_2")
self.lineEditName = QLineEdit(FrameProject)
self.lineEditName = QLineEdit(FrameMILProject)
self.lineEditName.setObjectName(u"lineEditName")
sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
@@ -57,14 +57,14 @@ class Ui_FrameProject(object):
self.gridLayout_2.addWidget(self.lineEditName, 0, 0, 1, 1)
self.lineEditDataPath = QLineEdit(FrameProject)
self.lineEditDataPath = QLineEdit(FrameMILProject)
self.lineEditDataPath.setObjectName(u"lineEditDataPath")
sizePolicy.setHeightForWidth(self.lineEditDataPath.sizePolicy().hasHeightForWidth())
self.lineEditDataPath.setSizePolicy(sizePolicy)
self.gridLayout_2.addWidget(self.lineEditDataPath, 1, 0, 1, 1)
self.lineEditFilePath = QLineEdit(FrameProject)
self.lineEditFilePath = QLineEdit(FrameMILProject)
self.lineEditFilePath.setObjectName(u"lineEditFilePath")
sizePolicy.setHeightForWidth(self.lineEditFilePath.sizePolicy().hasHeightForWidth())
self.lineEditFilePath.setSizePolicy(sizePolicy)
@@ -76,7 +76,7 @@ class Ui_FrameProject(object):
self.gridLayout_3 = QGridLayout()
self.gridLayout_3.setObjectName(u"gridLayout_3")
self.pushButtonDataPath = QPushButton(FrameProject)
self.pushButtonDataPath = QPushButton(FrameMILProject)
self.pushButtonDataPath.setObjectName(u"pushButtonDataPath")
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
sizePolicy1.setHorizontalStretch(0)
@@ -86,7 +86,7 @@ class Ui_FrameProject(object):
self.gridLayout_3.addWidget(self.pushButtonDataPath, 0, 0, 1, 1)
self.pushButtonFilePath = QPushButton(FrameProject)
self.pushButtonFilePath = QPushButton(FrameMILProject)
self.pushButtonFilePath.setObjectName(u"pushButtonFilePath")
sizePolicy1.setHeightForWidth(self.pushButtonFilePath.sizePolicy().hasHeightForWidth())
self.pushButtonFilePath.setSizePolicy(sizePolicy1)
@@ -97,18 +97,18 @@ class Ui_FrameProject(object):
self.gridLayout_4.addLayout(self.gridLayout_3, 0, 2, 1, 1)
self.retranslateUi(FrameProject)
self.retranslateUi(FrameMILProject)
QMetaObject.connectSlotsByName(FrameProject)
QMetaObject.connectSlotsByName(FrameMILProject)
# setupUi
def retranslateUi(self, FrameProject):
FrameProject.setWindowTitle(QCoreApplication.translate("FrameProject", u"Frame", None))
self.label.setText(QCoreApplication.translate("FrameProject", u"\u6a21\u578b\u9879\u76ee\uff1a", None))
self.label_2.setText(QCoreApplication.translate("FrameProject", u"\u6570\u636e\u6587\u4ef6\uff1a", None))
self.label_3.setText(QCoreApplication.translate("FrameProject", u"\u6d4b\u8bd5\u7528\u4f8b\uff1a", None))
def retranslateUi(self, FrameMILProject):
FrameMILProject.setWindowTitle(QCoreApplication.translate("FrameMILProject", u"Frame", None))
self.label.setText(QCoreApplication.translate("FrameMILProject", u"\u6a21\u578b\u9879\u76ee\uff1a", None))
self.label_2.setText(QCoreApplication.translate("FrameMILProject", u"\u6570\u636e\u6587\u4ef6\uff1a", None))
self.label_3.setText(QCoreApplication.translate("FrameMILProject", u"\u6d4b\u8bd5\u7528\u4f8b\uff1a", None))
self.lineEditName.setText("")
self.pushButtonDataPath.setText(QCoreApplication.translate("FrameProject", u"\u9009\u62e9\u6570\u636e\u6587\u4ef6", None))
self.pushButtonFilePath.setText(QCoreApplication.translate("FrameProject", u"\u9009\u62e9\u6d4b\u8bd5\u7528\u4f8b", None))
self.pushButtonDataPath.setText(QCoreApplication.translate("FrameMILProject", u"\u9009\u62e9\u6570\u636e\u6587\u4ef6", None))
self.pushButtonFilePath.setText(QCoreApplication.translate("FrameMILProject", u"\u9009\u62e9\u6d4b\u8bd5\u7528\u4f8b", None))
# retranslateUi
+174 -8
View File
@@ -1,8 +1,13 @@
import os
import logging
from pathlib import Path
from .mil_tool_ui import Ui_FrameMILTool
from PySide6.QtWidgets import QFrame
from PySide6.QtGui import *
from PySide6.QtCore import *
from PySide6.QtWidgets import *
from .mil_project import MILProject
from mil.core import Config
@@ -11,16 +16,177 @@ logger = logging.getLogger(__name__)
CONF = "mil.json"
class FrameMILTool(QFrame,Ui_FrameMILTool):
def __init__(self,parent=None):
def __init__(self,workspace:Path, parent=None):
super().__init__(parent)
self.setupUi(self)
self.initUI()
self.initUI(workspace)
def initUI(self):
self.config = Config()
if os.path.exists(CONF):
self.config.load_config(CONF)
def initUI(self, workspace:Path):
self.workspace = workspace
if not self.workspace.exists():
os.mkdir(self.workspace)
self.conf = self.workspace.joinpath(CONF)
self.config = Config(self.conf)
if self.config.check_path():
self.config.load_config()
self.checkBox.setChecked(self.config.AddTimeEn)
if self.config.GeratePath:
self.radioButtonData.setChecked(True)
else:
self.radioButtonFile.setChecked(True)
else:
self.config.save_config(CONF)
self.config.save_config()
self.update_config()
for key in self.config.ItemConfigs.keys():
self.add_pro_event(key)
self.menu = QMenu(self.listWidget)
self.new_pro_acction = QAction("新建项目", self)
self.new_pro_acction.triggered.connect(self.on_new_pro_event)
self.del_pro_acction = QAction("删除项目", self)
self.del_pro_acction.triggered.connect(self.on_del_pro_event)
self.menu.addAction(self.new_pro_acction)
self.menu.addAction(self.del_pro_acction)
self.DataPath.setReadOnly(True)
self.FilePath.setReadOnly(True)
self.DataButton.clicked.connect(self.on_load_data_path)
self.FileButton.clicked.connect(self.on_load_file_path)
self.checkBox.toggled.connect(self.on_select_add_time_en)
self.radioButtonData.toggled.connect(self.on_select_gerate_path)
self.comboBox.currentTextChanged.connect(self.on_text_changed_event)
self.listWidget.customContextMenuRequested.connect(self.on_ContextMenuRequested)
def update_config(self):
self.comboBox.clear()
if self.config.ItemConfigs.keys().__len__() == 0:
return
self.lock_event = True
for key in self.config.ItemConfigs.keys():
self.comboBox.addItem(key)
self.lock_event = False
if self.config.CurrProject == "":
self.config.CurrProject = self.comboBox.currentText()
self.config.save_config()
self.DataPath.setText(self.config.ItemConfigs[self.comboBox.currentText()]["DataPath"])
self.FilePath.setText(self.config.ItemConfigs[self.comboBox.currentText()]["FilePath"])
else:
self.comboBox.setCurrentText(self.config.CurrProject)
self.DataPath.setText(self.config.ItemConfigs[self.config.CurrProject]["DataPath"])
self.FilePath.setText(self.config.ItemConfigs[self.config.CurrProject]["FilePath"])
def on_update_data_path_event(self,name,data_path):
if name == self.comboBox.currentText():
self.DataPath.setText(data_path)
def on_update_file_path_event(self,name,file_path):
if name == self.comboBox.currentText():
self.FilePath.setText(file_path)
def on_select_gerate_path(self,checked):
self.config.GeratePath = checked
self.config.save_config()
def on_select_add_time_en(self,checked):
self.config.AddTimeEn = checked
self.config.save_config()
def on_ContextMenuRequested(self,point:QPoint):
self.menu.exec_(QCursor.pos())
def on_text_changed_event(self,text:str):
if text == "" or self.lock_event:
return
self.config.CurrProject= text
self.config.save_config()
self.DataPath.setText(self.config.ItemConfigs[self.config.CurrProject]["DataPath"])
self.FilePath.setText(self.config.ItemConfigs[self.config.CurrProject]["FilePath"])
pass
def on_new_pro_event(self):
item = QListWidgetItem()
mil_project = MILProject(self.config)
mil_project.update_item_name_signal.connect(self.update_config)
mil_project.update_item_data_path_signal.connect(self.on_update_data_path_event)
mil_project.update_item_file_path_signal.connect(self.on_update_file_path_event)
item.setSizeHint(QSize(mil_project.sizeHint().width(), 150))
self.listWidget.addItem(item)
self.listWidget.setCurrentItem(item)
self.listWidget.setItemWidget(item, mil_project)
pass
def add_pro_event(self, name):
item = QListWidgetItem()
mil_project = MILProject(self.config, name=name)
mil_project.update_item_name_signal.connect(self.update_config)
mil_project.update_item_data_path_signal.connect(self.on_update_data_path_event)
mil_project.update_item_file_path_signal.connect(self.on_update_file_path_event)
item.setSizeHint(QSize(mil_project.sizeHint().width(), 150))
self.listWidget.addItem(item)
self.listWidget.setCurrentItem(item)
self.listWidget.setItemWidget(item, mil_project)
def on_del_pro_event(self):
mil_project = self.listWidget.itemWidget(self.listWidget.currentItem())
if not isinstance(mil_project,MILProject):
raise "on_del_pro_event error!!!"
if self.config.CurrProject == mil_project.name:
self.config.CurrProject = ""
self.listWidget.takeItem(self.listWidget.currentRow())
self.config.ItemConfigs.pop(mil_project.name)
self.config.save_config()
self.update_config()
pass
def search_mil_pro_item(self, name):
for mil_project in self.listWidget.findChildren(MILProject):
if not isinstance(mil_project,MILProject):
return
if mil_project.name == name:
return mil_project
return None
def on_load_data_path(self):
data_path = self.DataPath.text()
if os.path.exists(data_path):
path,type = QFileDialog.getOpenFileName(self, "选择文件", data_path,"Excel工作簿(*.xlsx)")
else:
path,type = QFileDialog.getOpenFileName(self, "选择文件", os.getcwd(),"Excel工作簿(*.xlsx)")
self.DataPath.setText(path)
self.config.ItemConfigs[self.config.CurrProject]["DataPath"] = path
mil_project = self.search_mil_pro_item(self.config.CurrProject)
mil_project.lineEditDataPath.setText(path)
self.config.save_config()
def on_load_file_path(self):
file_path = self.FilePath.text()
if os.path.exists(file_path):
path,type = QFileDialog.getOpenFileName(self, "选择文件", file_path,"Excel工作簿(*.xlsx)")
else:
path,type = QFileDialog.getOpenFileName(self, "选择文件", os.getcwd(),"Excel工作簿(*.xlsx)")
self.FilePath.setText(path)
self.config.ItemConfigs[self.config.CurrProject]["FilePath"] = path
mil_project = self.search_mil_pro_item(self.config.CurrProject)
mil_project.lineEditFilePath.setText(path)
self.config.save_config()
+6 -2
View File
@@ -17,7 +17,7 @@
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">
<enum>QTabWidget::TabPosition::South</enum>
<enum>QTabWidget::TabPosition::North</enum>
</property>
<property name="currentIndex">
<number>0</number>
@@ -354,7 +354,11 @@
</attribute>
<layout class="QGridLayout" name="gridLayout_11">
<item row="0" column="0">
<widget class="QListWidget" name="listWidget"/>
<widget class="QListWidget" name="listWidget">
<property name="contextMenuPolicy">
<enum>Qt::ContextMenuPolicy::CustomContextMenu</enum>
</property>
</widget>
</item>
</layout>
</widget>
+2 -1
View File
@@ -29,7 +29,7 @@ class Ui_FrameMILTool(object):
self.gridLayout_8.setObjectName(u"gridLayout_8")
self.tabWidget = QTabWidget(FrameMILTool)
self.tabWidget.setObjectName(u"tabWidget")
self.tabWidget.setTabPosition(QTabWidget.TabPosition.South)
self.tabWidget.setTabPosition(QTabWidget.TabPosition.North)
self.widget = QWidget()
self.widget.setObjectName(u"widget")
self.gridLayout_12 = QGridLayout(self.widget)
@@ -272,6 +272,7 @@ class Ui_FrameMILTool(object):
self.gridLayout_11.setObjectName(u"gridLayout_11")
self.listWidget = QListWidget(self.tab_2)
self.listWidget.setObjectName(u"listWidget")
self.listWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.gridLayout_11.addWidget(self.listWidget, 0, 0, 1, 1)