From a7efcd0a853bc4c796e53717a99fe90ec74d9060 Mon Sep 17 00:00:00 2001
From: marques <20172333133@m.scnu.edu.cn>
Date: Sun, 31 Aug 2025 19:59:29 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0SA=E6=89=93=E6=A0=87=E7=95=8C?=
=?UTF-8?q?=E9=9D=A2=E5=BF=AB=E6=8D=B7=E9=94=AE=E8=AE=BE=E7=BD=AE=EF=BC=8C?=
=?UTF-8?q?=E8=B0=83=E6=95=B4=E6=8C=89=E9=92=AE=E6=96=87=E6=9C=AC=E5=8F=8A?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E6=8C=89=E9=92=AE=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
func/Module_SA_label_v2.py | 78 +++++++++++++++++++++++--
func/utils/ConfigParams.py | 7 ++-
ui/MainWindow/MainWindow_SA_label_v2.py | 10 ++--
ui/MainWindow/MainWindow_SA_label_v2.ui | 10 ++--
4 files changed, 88 insertions(+), 17 deletions(-)
diff --git a/func/Module_SA_label_v2.py b/func/Module_SA_label_v2.py
index 6c39f32..ff4752d 100644
--- a/func/Module_SA_label_v2.py
+++ b/func/Module_SA_label_v2.py
@@ -394,9 +394,11 @@ class Data:
start = one_data["correct_Start"] if one_data["isLabeled"] == 1 else one_data["Start"]
end = one_data["correct_End"] if one_data["isLabeled"] == 1 else one_data["End"]
+ event_type = one_data["correct_EventsType"] if one_data["isLabeled"] == 1 else one_data[
+ "Event type"]
self.event_label_revised[start * plot_freq:end * plot_freq] = self.event_type_to_value[
- one_data["Event type"]]
+ event_type]
self.event_index_revised[start:end] = one_data["Index"]
except Exception as e:
@@ -527,11 +529,36 @@ class DataFrameModel(QAbstractTableModel):
if role == Qt.ForegroundRole:
if "isLabeled" in self._dataframe.columns:
try:
- is_labeled_value = pd.to_numeric(self._showdata.iloc[row]["isLabeled"], errors='coerce')
+ print(self._showdata.iloc[row]["Index"])
+
+ event_index = self._showdata.iloc[row]["Index"]
+ is_labeled_value = self._dataframe[self._dataframe["Index"] == event_index]["isLabeled"]
+ if is_labeled_value.empty:
+ return None
+ is_labeled_value = is_labeled_value.values[0]
+
if is_labeled_value == 1:
- return QColor(0, 255, 0)
+ # remark 返回蓝色 score 1 返回绿色, 2返回橙色 3返回灰色 -1返回红色
+ # 获取此行的remark
+ remark = not self._dataframe[self._dataframe["Index"] == event_index]["remark"].values[0]
+ score = self._dataframe[self._dataframe["Index"] == event_index]["score"].values[0]
+ if remark == "待讨论":
+ return QColor(0, 0, 255)
+ elif score == 1:
+ return QColor(0, 255, 0)
+ elif score == 2:
+ return QColor(255, 165, 0)
+ elif score == 3:
+ return QColor(128, 128, 128)
+ elif score == -1:
+ return QColor(255, 0, 0)
+ else:
+ # 返回黑色
+ return QColor(0, 0, 0)
+
else:
- return QColor(255, 165, 0)
+ # 返回灰色
+ return QColor(0, 0, 0)
except Exception as e:
return None
@@ -628,9 +655,9 @@ class MainWindow_SA_label(QMainWindow):
self.display_columns_name_origin = ["事件编号", "事件类型", "起始时间(s)", "终止时间(s)"]
self.header_mapping_origin = dict(zip(self.display_columns_origin, self.display_columns_name_origin))
- self.display_columns_revised = ["Index", "isLabeled", "correct_EventsType", "score", "correct_Start",
+ self.display_columns_revised = ["Index", "correct_EventsType", "score", "correct_Start",
"correct_End"]
- self.display_columns_name_revised = ["事件编号", "已标注", "修正事件类型", "标签类型", "起始时间(s)",
+ self.display_columns_name_revised = ["事件编号", "修正事件类型", "标签类型", "起始时间(s)",
"终止时间(s)"]
self.header_mapping_revised = dict(zip(self.display_columns_revised, self.display_columns_name_revised))
@@ -681,6 +708,8 @@ class MainWindow_SA_label(QMainWindow):
self.figToolbar.cid_mouse_press = self.canvas.mpl_connect('button_press_event', self.on_press)
self.figToolbar.cid_mouse_release = self.canvas.mpl_connect('button_release_event', self.on_release)
self.figToolbar.cid_mouse_move = self.canvas.mpl_connect('motion_notify_event', self.on_motion)
+ self.figToolbar.cid_wheel = self.canvas.mpl_connect('scroll_event', self.__slot_wheel_move__)
+
self.ui.verticalLayout_canvas.addWidget(self.canvas)
self.ui.verticalLayout_canvas.addWidget(self.figToolbar)
@@ -819,6 +848,20 @@ class MainWindow_SA_label(QMainWindow):
QCoreApplication.translate("MainWindow", Params.SA_LABEL_BTN_NEXT_HALF_SHORTCUT_KEY))
self.ui.pushButton_best_fit.setShortcut(
QCoreApplication.translate("MainWindow", Params.SA_LABEL_BTN_BEST_FIT_SHORTCUT_KEY))
+ self.ui.pushButton_quick_remark_input_littleChange.setShortcut(
+ QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_LITTLE_CHANGED_SHORTCUT_KEY)
+ )
+ self.ui.pushButton_quick_remark_input_changeOnMiddle.setShortcut(
+ QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_CHANGED_ON_MIDDLE_SHORTCUT_KEY)
+ )
+ self.ui.pushButton_quick_remark_input_noNormalRespBetweenArtifact(
+ ).setShortcut(
+ QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_BETWEEN_ARTIFACT_SHORTCUT_KEY)
+ )
+ self.ui.pushButton_quick_remark_input_lowSignalNoiseRatio.setShortcut(
+ QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_LOW_SNR_SHORTCUT_KEY)
+ )
+
def load_data_to_table(self):
try:
@@ -830,12 +873,23 @@ class MainWindow_SA_label(QMainWindow):
self.header_mapping_revised)
self.ui.tableView_label_revised.setModel(self.data_model_revised)
+ # 按比例设置列宽
+ self.set_tableview_column_width_by_ratio(self.ui.tableView_label, [1, 3, 3, 3])
+ self.set_tableview_column_width_by_ratio(self.ui.tableView_label_revised, [1, 3, 1, 2, 2])
+
except Exception as e:
return Result().failure(info=Constants.UPDATE_FAILURE +
Constants.FAILURE_REASON["Update_tableWidget_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.UPDATE_FINISHED)
+ def set_tableview_column_width_by_ratio(self, tableview, ratios):
+ """按比例设置tableView每列宽度"""
+ total_width = tableview.viewport().width()
+ sum_ratio = sum(ratios)
+ for i, ratio in enumerate(ratios):
+ tableview.setColumnWidth(i, int(total_width * ratio / sum_ratio))
+
def best_fit(self):
plot_freq = self.config["Config"]["InputConfig"]["PlotFreq"]
start_point = self.config["WindowStartSecond"] * plot_freq
@@ -1711,6 +1765,13 @@ class MainWindow_SA_label(QMainWindow):
PublicFunc.text_output(self.ui, f"跳转到 {jump_time} 秒", Constants.TIPS_TYPE_INFO)
self.__jump_to__by_time__(jump_time)
+ def __slot_wheel_move__(self, event):
+ # 向上滚动,时间向前跳30秒,向下滚动,时间向后跳30秒
+ offset = 30 if event.step < 0 else -30
+ PublicFunc.text_output(self.ui, f"滚轮移动 {offset} 秒", Constants.TIPS_TYPE_INFO)
+ self.__jump_to__by_time__(self.config["WindowStartSecond"], offset)
+
+
def __slot_btn_quick_remark__(self):
sender = self.sender()
@@ -1811,6 +1872,8 @@ class MainWindow_SA_label(QMainWindow):
if start + value < 0:
return 0, self.config["WindowSignalSecond"]
elif start + value + self.config["WindowSignalSecond"] > self.config["SignalSecond"]:
+ PublicFunc.msgbox_output(self, "已到达信号末尾,无法继续前进!", Constants.MSGBOX_TYPE_WARNING)
+ PublicFunc.text_output(self.ui, "已到达信号末尾,无法继续前进!", Constants.TIPS_TYPE_ERROR)
return start - self.config["WindowSignalSecond"], self.config["SignalSecond"]
else:
return start + value, start + value + self.config["WindowSignalSecond"]
@@ -1889,6 +1952,9 @@ class CustomNavigationToolbar(NavigationToolbar2QT):
# Connect Pan action to toggle off Edit
self._actions['pan'].triggered.connect(self.toggle_pan)
+ self._actions['pan'].setShortcut(
+ QCoreApplication.translate("MainWindow", Params.SA_LABEL_BTN_PAN_MODE_SHORTCUT_KEY))
+
def drag_pan(self, event):
"""Callback for dragging in pan/zoom mode."""
diff --git a/func/utils/ConfigParams.py b/func/utils/ConfigParams.py
index 36a3887..50520ba 100644
--- a/func/utils/ConfigParams.py
+++ b/func/utils/ConfigParams.py
@@ -377,8 +377,9 @@ class Params:
SA_LABEL_BTN_NEXT_30s_SHORTCUT_KEY: str = "D"
SA_LABEL_BTN_PREV_HALF_SHORTCUT_KEY: str = "F"
SA_LABEL_BTN_NEXT_HALF_SHORTCUT_KEY: str = "G"
- SA_LABEL_BTN_BEST_FIT_SHORTCUT_KEY: str = "X"
+ SA_LABEL_BTN_BEST_FIT_SHORTCUT_KEY: str = "B"
SA_LABEL_BTN_EDIT_MODE_SHORTCUT_KEY: str = "Z"
+ SA_LABEL_BTN_PAN_MODE_SHORTCUT_KEY: str = "X"
SA_LABEL_BTN_CONFIRMLABEL_SHORTCUT_KEY: str = "S"
SA_LABEL_BTN_QUICK_REMARK_WAITINGFORTALK_SHORTCUT_KEY: str = "J"
SA_LABEL_RADIOBUTTON_OSA_SHORTCUT_KEY: str = "7"
@@ -388,6 +389,10 @@ class Params:
SA_LABEL_RADIOBUTTON_1_CLASS_SHORTCUT_KEY: str = "1"
SA_LABEL_RADIOBUTTON_2_CLASS_SHORTCUT_KEY: str = "2"
SA_LABEL_RADIOBUTTON_3_CLASS_SHORTCUT_KEY: str = "3"
+ SA_LABEL_BTN_LITTLE_CHANGED_SHORTCUT_KEY: str = "U"
+ SA_LABEL_BTN_CHANGED_ON_MIDDLE_SHORTCUT_KEY: str = "I"
+ SA_LABEL_BTN_BETWEEN_ARTIFACT_SHORTCUT_KEY: str = "O"
+ SA_LABEL_BTN_LOW_SNR_SHORTCUT_KEY: str = "P"
# 禁止实例化
diff --git a/ui/MainWindow/MainWindow_SA_label_v2.py b/ui/MainWindow/MainWindow_SA_label_v2.py
index 823e4e2..3c50787 100644
--- a/ui/MainWindow/MainWindow_SA_label_v2.py
+++ b/ui/MainWindow/MainWindow_SA_label_v2.py
@@ -653,7 +653,7 @@ class Ui_MainWindow_SA_label(object):
self.pushButton_input_setting.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5bfc\u5165\u8bbe\u7f6e", None))
self.pushButton_input.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5f00\u59cb\u5bfc\u5165", None))
self.checkBox_auto_save.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4fee\u6539\u540e\u81ea\u52a8\u4fdd\u5b58", None))
- self.pushButton_best_fit.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u81ea\u9002\u5e94\u5e45\u503c\uff08X\uff09", None))
+ self.pushButton_best_fit.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u81ea\u9002\u5e94\u5e45\u503c\uff08B\uff09", None))
self.label_4.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u663e\u793a\u7a97\u53e3\u957f\u5ea6/\u79d2\uff1a", None))
self.comboBox_window_signal_length.setItemText(0, QCoreApplication.translate("MainWindow_SA_label", u"30", None))
self.comboBox_window_signal_length.setItemText(1, QCoreApplication.translate("MainWindow_SA_label", u"60", None))
@@ -696,12 +696,12 @@ class Ui_MainWindow_SA_label(object):
self.label_7.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5feb\u901f\u5907\u6ce8\u8f93\u5165", None))
self.pushButton_quick_remark_input_durationNoEnough.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u65f6\u957f\u4e0d\u8db3", None))
self.pushButton_quick_remark_input_maybeWrongLabeled.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u7591\u4f3c\u533b\u751f\u8bef\u6807", None))
- self.pushButton_quick_remark_input_noNormalRespBetweenArtifact.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4f53\u52a8\u95f4\u65e0\u6b63\u5e38\u547c\u5438", None))
+ self.pushButton_quick_remark_input_noNormalRespBetweenArtifact.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4f53\u52a8\u95f4\u65e0\u6b63\u5e38\u547c\u5438(O)", None))
self.pushButton_quick_remark_input_maybeDesaturation.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e00\u7c7b-\u5f62\u4f3c\u6f6e\u5f0f\u547c\u5438", None))
- self.pushButton_quick_remark_input_littleChange.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u8d77\u4f0f\u53d8\u5316\u4e0d\u5927", None))
+ self.pushButton_quick_remark_input_littleChange.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u8d77\u4f0f\u53d8\u5316\u4e0d\u5927(U)", None))
self.pushButton_quick_remark_input_waitingForTalk.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5f85\u8ba8\u8bba(N)", None))
- self.pushButton_quick_remark_input_lowSignalNoiseRatio.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4fe1\u566a\u6bd4\u4f4e", None))
- self.pushButton_quick_remark_input_changeOnMiddle.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4e2d\u95f4\u8d77\u4f0f", None))
+ self.pushButton_quick_remark_input_lowSignalNoiseRatio.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4fe1\u566a\u6bd4\u4f4e(P)", None))
+ self.pushButton_quick_remark_input_changeOnMiddle.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4e2d\u95f4\u8d77\u4f0f(I)", None))
self.label_8.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4fee\u6b63\u540e\u8d77\u59cb\u65f6\u95f4(s)", None))
self.label_9.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4fee\u6b63\u540e\u7ec8\u6b62\u65f6\u95f4(s)", None))
self.pushButton_confirmLabel.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u786e\u5b9a\u6253\u6807\u53c2\u6570(S)", None))
diff --git a/ui/MainWindow/MainWindow_SA_label_v2.ui b/ui/MainWindow/MainWindow_SA_label_v2.ui
index 55f0e51..d2713bd 100644
--- a/ui/MainWindow/MainWindow_SA_label_v2.ui
+++ b/ui/MainWindow/MainWindow_SA_label_v2.ui
@@ -134,7 +134,7 @@
- 自适应幅值(X)
+ 自适应幅值(B)
false
@@ -867,7 +867,7 @@
- 二类-体动间无正常呼吸
+ 二类-体动间无正常呼吸(O)
@@ -903,7 +903,7 @@
- 二类-起伏变化不大
+ 二类-起伏变化不大(U)
@@ -939,7 +939,7 @@
- 二类-信噪比低
+ 二类-信噪比低(P)
@@ -957,7 +957,7 @@
- 二类-中间起伏
+ 二类-中间起伏(I)