diff --git a/.gitignore b/.gitignore index 47f391b..5aeb71e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,96 +1,3 @@ -# ---> JupyterNotebooks -# gitignore template for Jupyter Notebooks -# website: http://jupyter.org/ - -.ipynb_checkpoints -*/.ipynb_checkpoints/* - -# IPython -profile_default/ -ipython_config.py - -# Remove previous ipynb_checkpoints -# git rm -r .ipynb_checkpoints/ - -# ---> JetBrains -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - # ---> Python # Byte-compiled / optimized / DLL files __pycache__/ @@ -253,3 +160,99 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ +# ---> JetBrains +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +# ---> JupyterNotebooks +# gitignore template for Jupyter Notebooks +# website: http://jupyter.org/ + +.ipynb_checkpoints +*/.ipynb_checkpoints/* + +# IPython +profile_default/ +ipython_config.py + +# Remove previous ipynb_checkpoints +# git rm -r .ipynb_checkpoints/ +Label_Check/ +logs/* +.idea/* +!./logs \ No newline at end of file diff --git a/MainWindow.py b/MainWindow.py new file mode 100644 index 0000000..db6867f --- /dev/null +++ b/MainWindow.py @@ -0,0 +1,1226 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'MainWindow.ui' +# +# Created by: PyQt5 UI code generator 5.15.9 +# +# 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. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(1920, 1080) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) + self.gridLayout.setObjectName("gridLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.verticalLayout_left = QtWidgets.QVBoxLayout() + self.verticalLayout_left.setObjectName("verticalLayout_left") + self.groupBox_inputSetting = QtWidgets.QGroupBox(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_inputSetting.sizePolicy().hasHeightForWidth()) + self.groupBox_inputSetting.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(10) + self.groupBox_inputSetting.setFont(font) + self.groupBox_inputSetting.setObjectName("groupBox_inputSetting") + self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox_inputSetting) + self.gridLayout_4.setObjectName("gridLayout_4") + self.lineEdit_rootpath = QtWidgets.QLineEdit(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_rootpath.sizePolicy().hasHeightForWidth()) + self.lineEdit_rootpath.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(10) + self.lineEdit_rootpath.setFont(font) + self.lineEdit_rootpath.setText("") + self.lineEdit_rootpath.setObjectName("lineEdit_rootpath") + self.gridLayout_4.addWidget(self.lineEdit_rootpath, 3, 0, 1, 2) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout_4.addItem(spacerItem, 6, 0, 1, 5) + self.label_choose = QtWidgets.QLabel(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_choose.sizePolicy().hasHeightForWidth()) + self.label_choose.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_choose.setFont(font) + self.label_choose.setObjectName("label_choose") + self.gridLayout_4.addWidget(self.label_choose, 4, 0, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout_4.addItem(spacerItem1, 11, 0, 1, 5) + spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout_4.addItem(spacerItem2, 14, 0, 1, 5) + self.radioButton_inputMode_auto = QtWidgets.QRadioButton(self.groupBox_inputSetting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.radioButton_inputMode_auto.setFont(font) + self.radioButton_inputMode_auto.setObjectName("radioButton_inputMode_auto") + self.gridLayout_4.addWidget(self.radioButton_inputMode_auto, 0, 0, 1, 1) + self.groupBox_label2 = QtWidgets.QGroupBox(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_label2.sizePolicy().hasHeightForWidth()) + self.groupBox_label2.setSizePolicy(sizePolicy) + self.groupBox_label2.setObjectName("groupBox_label2") + self.gridLayout_17 = QtWidgets.QGridLayout(self.groupBox_label2) + self.gridLayout_17.setObjectName("gridLayout_17") + self.lineEdit_label2path = QtWidgets.QLineEdit(self.groupBox_label2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_label2path.sizePolicy().hasHeightForWidth()) + self.lineEdit_label2path.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(10) + self.lineEdit_label2path.setFont(font) + self.lineEdit_label2path.setObjectName("lineEdit_label2path") + self.gridLayout_17.addWidget(self.lineEdit_label2path, 0, 1, 1, 1) + self.pushButton_label2path_open = QtWidgets.QPushButton(self.groupBox_label2) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_label2path_open.setFont(font) + self.pushButton_label2path_open.setObjectName("pushButton_label2path_open") + self.gridLayout_17.addWidget(self.pushButton_label2path_open, 0, 2, 1, 1) + self.gridLayout_4.addWidget(self.groupBox_label2, 13, 0, 1, 5) + self.groupBox_label1 = QtWidgets.QGroupBox(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_label1.sizePolicy().hasHeightForWidth()) + self.groupBox_label1.setSizePolicy(sizePolicy) + self.groupBox_label1.setObjectName("groupBox_label1") + self.gridLayout_16 = QtWidgets.QGridLayout(self.groupBox_label1) + self.gridLayout_16.setObjectName("gridLayout_16") + self.lineEdit_label1path = QtWidgets.QLineEdit(self.groupBox_label1) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_label1path.sizePolicy().hasHeightForWidth()) + self.lineEdit_label1path.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(10) + self.lineEdit_label1path.setFont(font) + self.lineEdit_label1path.setObjectName("lineEdit_label1path") + self.gridLayout_16.addWidget(self.lineEdit_label1path, 0, 1, 1, 1) + self.pushButton_label1path_open = QtWidgets.QPushButton(self.groupBox_label1) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_label1path_open.setFont(font) + self.pushButton_label1path_open.setObjectName("pushButton_label1path_open") + self.gridLayout_16.addWidget(self.pushButton_label1path_open, 0, 2, 1, 1) + self.gridLayout_4.addWidget(self.groupBox_label1, 12, 0, 1, 5) + self.groupBox_data1 = QtWidgets.QGroupBox(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_data1.sizePolicy().hasHeightForWidth()) + self.groupBox_data1.setSizePolicy(sizePolicy) + self.groupBox_data1.setObjectName("groupBox_data1") + self.gridLayout_8 = QtWidgets.QGridLayout(self.groupBox_data1) + self.gridLayout_8.setObjectName("gridLayout_8") + self.lineEdit_data1path = QtWidgets.QLineEdit(self.groupBox_data1) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data1path.sizePolicy().hasHeightForWidth()) + self.lineEdit_data1path.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(10) + self.lineEdit_data1path.setFont(font) + self.lineEdit_data1path.setObjectName("lineEdit_data1path") + self.gridLayout_8.addWidget(self.lineEdit_data1path, 1, 1, 1, 1) + self.groupBox_data1_preprocess = QtWidgets.QGroupBox(self.groupBox_data1) + self.groupBox_data1_preprocess.setObjectName("groupBox_data1_preprocess") + self.gridLayout_10 = QtWidgets.QGridLayout(self.groupBox_data1_preprocess) + self.gridLayout_10.setObjectName("gridLayout_10") + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_10.addItem(spacerItem3, 1, 3, 1, 1) + self.label_data1_fillterFrequency = QtWidgets.QLabel(self.groupBox_data1_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_data1_fillterFrequency.sizePolicy().hasHeightForWidth()) + self.label_data1_fillterFrequency.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.label_data1_fillterFrequency.setFont(font) + self.label_data1_fillterFrequency.setObjectName("label_data1_fillterFrequency") + self.gridLayout_10.addWidget(self.label_data1_fillterFrequency, 1, 4, 1, 1) + self.label_data1_fillterNum = QtWidgets.QLabel(self.groupBox_data1_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_data1_fillterNum.sizePolicy().hasHeightForWidth()) + self.label_data1_fillterNum.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.label_data1_fillterNum.setFont(font) + self.label_data1_fillterNum.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_data1_fillterNum.setObjectName("label_data1_fillterNum") + self.gridLayout_10.addWidget(self.label_data1_fillterNum, 1, 1, 1, 1) + self.lineEdit_data1_fillterFrequency_min = QtWidgets.QLineEdit(self.groupBox_data1_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data1_fillterFrequency_min.sizePolicy().hasHeightForWidth()) + self.lineEdit_data1_fillterFrequency_min.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.lineEdit_data1_fillterFrequency_min.setFont(font) + self.lineEdit_data1_fillterFrequency_min.setObjectName("lineEdit_data1_fillterFrequency_min") + self.gridLayout_10.addWidget(self.lineEdit_data1_fillterFrequency_min, 1, 5, 1, 1) + self.lineEdit_data1_fillterNum = QtWidgets.QLineEdit(self.groupBox_data1_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data1_fillterNum.sizePolicy().hasHeightForWidth()) + self.lineEdit_data1_fillterNum.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.lineEdit_data1_fillterNum.setFont(font) + self.lineEdit_data1_fillterNum.setObjectName("lineEdit_data1_fillterNum") + self.gridLayout_10.addWidget(self.lineEdit_data1_fillterNum, 1, 2, 1, 1) + self.lineEdit_data1_fillterFrequency_max = QtWidgets.QLineEdit(self.groupBox_data1_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data1_fillterFrequency_max.sizePolicy().hasHeightForWidth()) + self.lineEdit_data1_fillterFrequency_max.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.lineEdit_data1_fillterFrequency_max.setFont(font) + self.lineEdit_data1_fillterFrequency_max.setObjectName("lineEdit_data1_fillterFrequency_max") + self.gridLayout_10.addWidget(self.lineEdit_data1_fillterFrequency_max, 1, 7, 1, 1) + self.label_3 = QtWidgets.QLabel(self.groupBox_data1_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth()) + self.label_3.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.label_3.setFont(font) + self.label_3.setAlignment(QtCore.Qt.AlignCenter) + self.label_3.setObjectName("label_3") + self.gridLayout_10.addWidget(self.label_3, 1, 6, 1, 1) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_10.addItem(spacerItem4, 1, 0, 1, 1) + self.radioButton_data1_fillterMode = QtWidgets.QRadioButton(self.groupBox_data1_preprocess) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(12) + self.radioButton_data1_fillterMode.setFont(font) + self.radioButton_data1_fillterMode.setObjectName("radioButton_data1_fillterMode") + self.gridLayout_10.addWidget(self.radioButton_data1_fillterMode, 0, 0, 1, 8) + self.gridLayout_10.setColumnStretch(0, 1) + self.gridLayout_10.setColumnStretch(1, 4) + self.gridLayout_10.setColumnStretch(2, 1) + self.gridLayout_10.setColumnStretch(3, 5) + self.gridLayout_10.setColumnStretch(4, 4) + self.gridLayout_10.setColumnStretch(5, 1) + self.gridLayout_10.setColumnStretch(6, 2) + self.gridLayout_10.setColumnStretch(7, 1) + self.gridLayout_8.addWidget(self.groupBox_data1_preprocess, 2, 1, 1, 2) + self.pushButton_data1path_open = QtWidgets.QPushButton(self.groupBox_data1) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_data1path_open.setFont(font) + self.pushButton_data1path_open.setObjectName("pushButton_data1path_open") + self.gridLayout_8.addWidget(self.pushButton_data1path_open, 1, 2, 1, 1) + self.gridLayout_4.addWidget(self.groupBox_data1, 7, 0, 1, 5) + self.pushButton_rootpath_open = QtWidgets.QPushButton(self.groupBox_inputSetting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_rootpath_open.setFont(font) + self.pushButton_rootpath_open.setObjectName("pushButton_rootpath_open") + self.gridLayout_4.addWidget(self.pushButton_rootpath_open, 3, 2, 1, 3) + self.horizontalLayout_frequencySetting_and_input = QtWidgets.QHBoxLayout() + self.horizontalLayout_frequencySetting_and_input.setObjectName("horizontalLayout_frequencySetting_and_input") + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_frequencySetting_and_input.addItem(spacerItem5) + self.label_frequency = QtWidgets.QLabel(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_frequency.sizePolicy().hasHeightForWidth()) + self.label_frequency.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_frequency.setFont(font) + self.label_frequency.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_frequency.setObjectName("label_frequency") + self.horizontalLayout_frequencySetting_and_input.addWidget(self.label_frequency) + self.lineEdit_frequency = QtWidgets.QLineEdit(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_frequency.sizePolicy().hasHeightForWidth()) + self.lineEdit_frequency.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_frequency.setFont(font) + self.lineEdit_frequency.setObjectName("lineEdit_frequency") + self.horizontalLayout_frequencySetting_and_input.addWidget(self.lineEdit_frequency) + self.label_frequency_Hz = QtWidgets.QLabel(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_frequency_Hz.sizePolicy().hasHeightForWidth()) + self.label_frequency_Hz.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_frequency_Hz.setFont(font) + self.label_frequency_Hz.setAlignment(QtCore.Qt.AlignCenter) + self.label_frequency_Hz.setObjectName("label_frequency_Hz") + self.horizontalLayout_frequencySetting_and_input.addWidget(self.label_frequency_Hz) + self.pushButton_dataInput = QtWidgets.QPushButton(self.groupBox_inputSetting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_dataInput.setFont(font) + self.pushButton_dataInput.setObjectName("pushButton_dataInput") + self.horizontalLayout_frequencySetting_and_input.addWidget(self.pushButton_dataInput) + spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_frequencySetting_and_input.addItem(spacerItem6) + self.horizontalLayout_frequencySetting_and_input.setStretch(1, 5) + self.horizontalLayout_frequencySetting_and_input.setStretch(2, 2) + self.horizontalLayout_frequencySetting_and_input.setStretch(3, 2) + self.horizontalLayout_frequencySetting_and_input.setStretch(4, 5) + self.gridLayout_4.addLayout(self.horizontalLayout_frequencySetting_and_input, 15, 0, 1, 5) + self.groupBox_data2 = QtWidgets.QGroupBox(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_data2.sizePolicy().hasHeightForWidth()) + self.groupBox_data2.setSizePolicy(sizePolicy) + self.groupBox_data2.setObjectName("groupBox_data2") + self.gridLayout_9 = QtWidgets.QGridLayout(self.groupBox_data2) + self.gridLayout_9.setObjectName("gridLayout_9") + self.lineEdit_data2path = QtWidgets.QLineEdit(self.groupBox_data2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data2path.sizePolicy().hasHeightForWidth()) + self.lineEdit_data2path.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(10) + self.lineEdit_data2path.setFont(font) + self.lineEdit_data2path.setText("") + self.lineEdit_data2path.setObjectName("lineEdit_data2path") + self.gridLayout_9.addWidget(self.lineEdit_data2path, 0, 0, 1, 1) + self.pushButton_data2path_open = QtWidgets.QPushButton(self.groupBox_data2) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_data2path_open.setFont(font) + self.pushButton_data2path_open.setObjectName("pushButton_data2path_open") + self.gridLayout_9.addWidget(self.pushButton_data2path_open, 0, 1, 1, 1) + self.groupBox_data2_preprocess = QtWidgets.QGroupBox(self.groupBox_data2) + self.groupBox_data2_preprocess.setObjectName("groupBox_data2_preprocess") + self.gridLayout_11 = QtWidgets.QGridLayout(self.groupBox_data2_preprocess) + self.gridLayout_11.setObjectName("gridLayout_11") + spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_11.addItem(spacerItem7, 1, 3, 1, 1) + self.label_data2_fillterFrequency = QtWidgets.QLabel(self.groupBox_data2_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_data2_fillterFrequency.sizePolicy().hasHeightForWidth()) + self.label_data2_fillterFrequency.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.label_data2_fillterFrequency.setFont(font) + self.label_data2_fillterFrequency.setObjectName("label_data2_fillterFrequency") + self.gridLayout_11.addWidget(self.label_data2_fillterFrequency, 1, 4, 1, 1) + self.label_data2_fillterNum = QtWidgets.QLabel(self.groupBox_data2_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_data2_fillterNum.sizePolicy().hasHeightForWidth()) + self.label_data2_fillterNum.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.label_data2_fillterNum.setFont(font) + self.label_data2_fillterNum.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_data2_fillterNum.setObjectName("label_data2_fillterNum") + self.gridLayout_11.addWidget(self.label_data2_fillterNum, 1, 1, 1, 1) + self.lineEdit_data2_fillterFrequency_min = QtWidgets.QLineEdit(self.groupBox_data2_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data2_fillterFrequency_min.sizePolicy().hasHeightForWidth()) + self.lineEdit_data2_fillterFrequency_min.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.lineEdit_data2_fillterFrequency_min.setFont(font) + self.lineEdit_data2_fillterFrequency_min.setObjectName("lineEdit_data2_fillterFrequency_min") + self.gridLayout_11.addWidget(self.lineEdit_data2_fillterFrequency_min, 1, 5, 1, 1) + self.lineEdit_data2_fillterNum = QtWidgets.QLineEdit(self.groupBox_data2_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data2_fillterNum.sizePolicy().hasHeightForWidth()) + self.lineEdit_data2_fillterNum.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.lineEdit_data2_fillterNum.setFont(font) + self.lineEdit_data2_fillterNum.setObjectName("lineEdit_data2_fillterNum") + self.gridLayout_11.addWidget(self.lineEdit_data2_fillterNum, 1, 2, 1, 1) + self.lineEdit_data2_fillterFrequency_max = QtWidgets.QLineEdit(self.groupBox_data2_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_data2_fillterFrequency_max.sizePolicy().hasHeightForWidth()) + self.lineEdit_data2_fillterFrequency_max.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.lineEdit_data2_fillterFrequency_max.setFont(font) + self.lineEdit_data2_fillterFrequency_max.setObjectName("lineEdit_data2_fillterFrequency_max") + self.gridLayout_11.addWidget(self.lineEdit_data2_fillterFrequency_max, 1, 7, 1, 1) + self.label_4 = QtWidgets.QLabel(self.groupBox_data2_preprocess) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth()) + self.label_4.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.label_4.setFont(font) + self.label_4.setAlignment(QtCore.Qt.AlignCenter) + self.label_4.setObjectName("label_4") + self.gridLayout_11.addWidget(self.label_4, 1, 6, 1, 1) + spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_11.addItem(spacerItem8, 1, 0, 1, 1) + self.radioButton_data2_fillterMode = QtWidgets.QRadioButton(self.groupBox_data2_preprocess) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(12) + self.radioButton_data2_fillterMode.setFont(font) + self.radioButton_data2_fillterMode.setObjectName("radioButton_data2_fillterMode") + self.gridLayout_11.addWidget(self.radioButton_data2_fillterMode, 0, 0, 1, 8) + self.gridLayout_11.setColumnStretch(0, 1) + self.gridLayout_11.setColumnStretch(1, 4) + self.gridLayout_11.setColumnStretch(2, 1) + self.gridLayout_11.setColumnStretch(3, 5) + self.gridLayout_11.setColumnStretch(4, 4) + self.gridLayout_11.setColumnStretch(5, 1) + self.gridLayout_11.setColumnStretch(6, 2) + self.gridLayout_11.setColumnStretch(7, 1) + self.gridLayout_9.addWidget(self.groupBox_data2_preprocess, 1, 0, 1, 2) + self.gridLayout_4.addWidget(self.groupBox_data2, 10, 0, 1, 5) + self.radioButton_inputMode_manual = QtWidgets.QRadioButton(self.groupBox_inputSetting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.radioButton_inputMode_manual.setFont(font) + self.radioButton_inputMode_manual.setObjectName("radioButton_inputMode_manual") + self.gridLayout_4.addWidget(self.radioButton_inputMode_manual, 0, 1, 1, 4) + self.comboBox_choose = QtWidgets.QComboBox(self.groupBox_inputSetting) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.comboBox_choose.setFont(font) + self.comboBox_choose.setObjectName("comboBox_choose") + self.gridLayout_4.addWidget(self.comboBox_choose, 4, 1, 1, 4) + self.groupBox_save = QtWidgets.QGroupBox(self.groupBox_inputSetting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_save.sizePolicy().hasHeightForWidth()) + self.groupBox_save.setSizePolicy(sizePolicy) + self.groupBox_save.setObjectName("groupBox_save") + self.gridLayout_19 = QtWidgets.QGridLayout(self.groupBox_save) + self.gridLayout_19.setObjectName("gridLayout_19") + self.lineEdit_savepath = QtWidgets.QLineEdit(self.groupBox_save) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_savepath.sizePolicy().hasHeightForWidth()) + self.lineEdit_savepath.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(10) + self.lineEdit_savepath.setFont(font) + self.lineEdit_savepath.setObjectName("lineEdit_savepath") + self.gridLayout_19.addWidget(self.lineEdit_savepath, 0, 1, 1, 1) + self.pushButton_savepath_open = QtWidgets.QPushButton(self.groupBox_save) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_savepath_open.setFont(font) + self.pushButton_savepath_open.setObjectName("pushButton_savepath_open") + self.gridLayout_19.addWidget(self.pushButton_savepath_open, 0, 2, 1, 1) + self.gridLayout_4.addWidget(self.groupBox_save, 5, 0, 1, 5) + self.verticalLayout_left.addWidget(self.groupBox_inputSetting) + spacerItem9 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_left.addItem(spacerItem9) + self.groupBox_autoplay = QtWidgets.QGroupBox(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_autoplay.sizePolicy().hasHeightForWidth()) + self.groupBox_autoplay.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(10) + self.groupBox_autoplay.setFont(font) + self.groupBox_autoplay.setObjectName("groupBox_autoplay") + self.gridLayout_6 = QtWidgets.QGridLayout(self.groupBox_autoplay) + self.gridLayout_6.setObjectName("gridLayout_6") + self.groupBox_move_setting = QtWidgets.QGroupBox(self.groupBox_autoplay) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_move_setting.sizePolicy().hasHeightForWidth()) + self.groupBox_move_setting.setSizePolicy(sizePolicy) + self.groupBox_move_setting.setObjectName("groupBox_move_setting") + self.gridLayout_18 = QtWidgets.QGridLayout(self.groupBox_move_setting) + self.gridLayout_18.setObjectName("gridLayout_18") + self.radioButton_move_preset_3 = QtWidgets.QRadioButton(self.groupBox_move_setting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.radioButton_move_preset_3.setFont(font) + self.radioButton_move_preset_3.setObjectName("radioButton_move_preset_3") + self.gridLayout_18.addWidget(self.radioButton_move_preset_3, 3, 0, 1, 1) + self.lineEdit_moveLength = QtWidgets.QLineEdit(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_moveLength.sizePolicy().hasHeightForWidth()) + self.lineEdit_moveLength.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_moveLength.setFont(font) + self.lineEdit_moveLength.setAlignment(QtCore.Qt.AlignCenter) + self.lineEdit_moveLength.setObjectName("lineEdit_moveLength") + self.gridLayout_18.addWidget(self.lineEdit_moveLength, 5, 1, 1, 1) + self.label_maxRange_preset_3 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_maxRange_preset_3.sizePolicy().hasHeightForWidth()) + self.label_maxRange_preset_3.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_maxRange_preset_3.setFont(font) + self.label_maxRange_preset_3.setAlignment(QtCore.Qt.AlignCenter) + self.label_maxRange_preset_3.setObjectName("label_maxRange_preset_3") + self.gridLayout_18.addWidget(self.label_maxRange_preset_3, 3, 2, 1, 1) + self.label_moveLength_preset_3 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveLength_preset_3.sizePolicy().hasHeightForWidth()) + self.label_moveLength_preset_3.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveLength_preset_3.setFont(font) + self.label_moveLength_preset_3.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveLength_preset_3.setObjectName("label_moveLength_preset_3") + self.gridLayout_18.addWidget(self.label_moveLength_preset_3, 3, 1, 1, 1) + self.label_maxRange = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_maxRange.sizePolicy().hasHeightForWidth()) + self.label_maxRange.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_maxRange.setFont(font) + self.label_maxRange.setAlignment(QtCore.Qt.AlignCenter) + self.label_maxRange.setObjectName("label_maxRange") + self.gridLayout_18.addWidget(self.label_maxRange, 0, 2, 1, 1) + self.label_moveSpeed_preset_2 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveSpeed_preset_2.sizePolicy().hasHeightForWidth()) + self.label_moveSpeed_preset_2.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveSpeed_preset_2.setFont(font) + self.label_moveSpeed_preset_2.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveSpeed_preset_2.setObjectName("label_moveSpeed_preset_2") + self.gridLayout_18.addWidget(self.label_moveSpeed_preset_2, 2, 3, 1, 2) + self.label_moveLength_preset_1 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveLength_preset_1.sizePolicy().hasHeightForWidth()) + self.label_moveLength_preset_1.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveLength_preset_1.setFont(font) + self.label_moveLength_preset_1.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveLength_preset_1.setObjectName("label_moveLength_preset_1") + self.gridLayout_18.addWidget(self.label_moveLength_preset_1, 1, 1, 1, 1) + self.label_moveSpeed_preset_1 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveSpeed_preset_1.sizePolicy().hasHeightForWidth()) + self.label_moveSpeed_preset_1.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveSpeed_preset_1.setFont(font) + self.label_moveSpeed_preset_1.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveSpeed_preset_1.setObjectName("label_moveSpeed_preset_1") + self.gridLayout_18.addWidget(self.label_moveSpeed_preset_1, 1, 3, 1, 2) + self.lineEdit_maxRange = QtWidgets.QLineEdit(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_maxRange.sizePolicy().hasHeightForWidth()) + self.lineEdit_maxRange.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_maxRange.setFont(font) + self.lineEdit_maxRange.setAlignment(QtCore.Qt.AlignCenter) + self.lineEdit_maxRange.setObjectName("lineEdit_maxRange") + self.gridLayout_18.addWidget(self.lineEdit_maxRange, 5, 2, 1, 1) + self.label_maxRange_preset_2 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_maxRange_preset_2.sizePolicy().hasHeightForWidth()) + self.label_maxRange_preset_2.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_maxRange_preset_2.setFont(font) + self.label_maxRange_preset_2.setAlignment(QtCore.Qt.AlignCenter) + self.label_maxRange_preset_2.setObjectName("label_maxRange_preset_2") + self.gridLayout_18.addWidget(self.label_maxRange_preset_2, 2, 2, 1, 1) + self.radioButton_move_preset_1 = QtWidgets.QRadioButton(self.groupBox_move_setting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.radioButton_move_preset_1.setFont(font) + self.radioButton_move_preset_1.setObjectName("radioButton_move_preset_1") + self.gridLayout_18.addWidget(self.radioButton_move_preset_1, 1, 0, 1, 1) + self.radioButton_move_preset_2 = QtWidgets.QRadioButton(self.groupBox_move_setting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.radioButton_move_preset_2.setFont(font) + self.radioButton_move_preset_2.setObjectName("radioButton_move_preset_2") + self.gridLayout_18.addWidget(self.radioButton_move_preset_2, 2, 0, 1, 1) + self.radioButton_move_custom = QtWidgets.QRadioButton(self.groupBox_move_setting) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.radioButton_move_custom.setFont(font) + self.radioButton_move_custom.setObjectName("radioButton_move_custom") + self.gridLayout_18.addWidget(self.radioButton_move_custom, 5, 0, 1, 1) + self.label_moveLength = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveLength.sizePolicy().hasHeightForWidth()) + self.label_moveLength.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveLength.setFont(font) + self.label_moveLength.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveLength.setObjectName("label_moveLength") + self.gridLayout_18.addWidget(self.label_moveLength, 0, 1, 1, 1) + self.label_moveLength_preset_2 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveLength_preset_2.sizePolicy().hasHeightForWidth()) + self.label_moveLength_preset_2.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveLength_preset_2.setFont(font) + self.label_moveLength_preset_2.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveLength_preset_2.setObjectName("label_moveLength_preset_2") + self.gridLayout_18.addWidget(self.label_moveLength_preset_2, 2, 1, 1, 1) + self.label_maxRange_preset_1 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_maxRange_preset_1.sizePolicy().hasHeightForWidth()) + self.label_maxRange_preset_1.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_maxRange_preset_1.setFont(font) + self.label_maxRange_preset_1.setAlignment(QtCore.Qt.AlignCenter) + self.label_maxRange_preset_1.setObjectName("label_maxRange_preset_1") + self.gridLayout_18.addWidget(self.label_maxRange_preset_1, 1, 2, 1, 1) + self.lineEdit_moveSpeed = QtWidgets.QLineEdit(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_moveSpeed.sizePolicy().hasHeightForWidth()) + self.lineEdit_moveSpeed.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_moveSpeed.setFont(font) + self.lineEdit_moveSpeed.setAlignment(QtCore.Qt.AlignCenter) + self.lineEdit_moveSpeed.setObjectName("lineEdit_moveSpeed") + self.gridLayout_18.addWidget(self.lineEdit_moveSpeed, 5, 3, 1, 1) + self.label_moveSpeed_preset_3 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveSpeed_preset_3.sizePolicy().hasHeightForWidth()) + self.label_moveSpeed_preset_3.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveSpeed_preset_3.setFont(font) + self.label_moveSpeed_preset_3.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveSpeed_preset_3.setObjectName("label_moveSpeed_preset_3") + self.gridLayout_18.addWidget(self.label_moveSpeed_preset_3, 3, 3, 1, 2) + self.label_ms_2 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_ms_2.sizePolicy().hasHeightForWidth()) + self.label_ms_2.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_ms_2.setFont(font) + self.label_ms_2.setAlignment(QtCore.Qt.AlignCenter) + self.label_ms_2.setObjectName("label_ms_2") + self.gridLayout_18.addWidget(self.label_ms_2, 2, 5, 1, 1) + self.label_ms_4 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_ms_4.sizePolicy().hasHeightForWidth()) + self.label_ms_4.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_ms_4.setFont(font) + self.label_ms_4.setAlignment(QtCore.Qt.AlignCenter) + self.label_ms_4.setObjectName("label_ms_4") + self.gridLayout_18.addWidget(self.label_ms_4, 5, 5, 1, 1) + self.label_ms_3 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_ms_3.sizePolicy().hasHeightForWidth()) + self.label_ms_3.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_ms_3.setFont(font) + self.label_ms_3.setAlignment(QtCore.Qt.AlignCenter) + self.label_ms_3.setObjectName("label_ms_3") + self.gridLayout_18.addWidget(self.label_ms_3, 3, 5, 1, 1) + self.label_ms_1 = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_ms_1.sizePolicy().hasHeightForWidth()) + self.label_ms_1.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_ms_1.setFont(font) + self.label_ms_1.setAlignment(QtCore.Qt.AlignCenter) + self.label_ms_1.setObjectName("label_ms_1") + self.gridLayout_18.addWidget(self.label_ms_1, 1, 5, 1, 1) + self.label_moveSpeed = QtWidgets.QLabel(self.groupBox_move_setting) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_moveSpeed.sizePolicy().hasHeightForWidth()) + self.label_moveSpeed.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_moveSpeed.setFont(font) + self.label_moveSpeed.setAlignment(QtCore.Qt.AlignCenter) + self.label_moveSpeed.setObjectName("label_moveSpeed") + self.gridLayout_18.addWidget(self.label_moveSpeed, 0, 3, 1, 3) + self.gridLayout_6.addWidget(self.groupBox_move_setting, 1, 0, 1, 1) + self.groupBox_move = QtWidgets.QGroupBox(self.groupBox_autoplay) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_move.sizePolicy().hasHeightForWidth()) + self.groupBox_move.setSizePolicy(sizePolicy) + self.groupBox_move.setObjectName("groupBox_move") + self.gridLayout_49 = QtWidgets.QGridLayout(self.groupBox_move) + self.gridLayout_49.setObjectName("gridLayout_49") + self.horizontalLayout_move_operate = QtWidgets.QHBoxLayout() + self.horizontalLayout_move_operate.setObjectName("horizontalLayout_move_operate") + self.pushButton_left_move = QtWidgets.QPushButton(self.groupBox_move) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_left_move.sizePolicy().hasHeightForWidth()) + self.pushButton_left_move.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_left_move.setFont(font) + self.pushButton_left_move.setObjectName("pushButton_left_move") + self.horizontalLayout_move_operate.addWidget(self.pushButton_left_move) + self.pushButton_pause = QtWidgets.QPushButton(self.groupBox_move) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_pause.sizePolicy().hasHeightForWidth()) + self.pushButton_pause.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_pause.setFont(font) + self.pushButton_pause.setObjectName("pushButton_pause") + self.horizontalLayout_move_operate.addWidget(self.pushButton_pause) + self.pushButton_right_move = QtWidgets.QPushButton(self.groupBox_move) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_right_move.sizePolicy().hasHeightForWidth()) + self.pushButton_right_move.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_right_move.setFont(font) + self.pushButton_right_move.setObjectName("pushButton_right_move") + self.horizontalLayout_move_operate.addWidget(self.pushButton_right_move) + self.gridLayout_49.addLayout(self.horizontalLayout_move_operate, 0, 0, 1, 2) + self.gridLayout_6.addWidget(self.groupBox_move, 0, 0, 1, 1) + self.verticalLayout_left.addWidget(self.groupBox_autoplay) + spacerItem10 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_left.addItem(spacerItem10) + self.groupBox_findpeaks_options = QtWidgets.QGroupBox(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_findpeaks_options.sizePolicy().hasHeightForWidth()) + self.groupBox_findpeaks_options.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(10) + self.groupBox_findpeaks_options.setFont(font) + self.groupBox_findpeaks_options.setObjectName("groupBox_findpeaks_options") + self.gridLayout_21 = QtWidgets.QGridLayout(self.groupBox_findpeaks_options) + self.gridLayout_21.setObjectName("gridLayout_21") + self.label_6 = QtWidgets.QLabel(self.groupBox_findpeaks_options) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) + self.label_6.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.label_6.setFont(font) + self.label_6.setObjectName("label_6") + self.gridLayout_21.addWidget(self.label_6, 0, 2, 1, 1) + self.label_5 = QtWidgets.QLabel(self.groupBox_findpeaks_options) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth()) + self.label_5.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.label_5.setFont(font) + self.label_5.setObjectName("label_5") + self.gridLayout_21.addWidget(self.label_5, 0, 0, 1, 1) + self.lineEdit_findpeaks_min_interval = QtWidgets.QLineEdit(self.groupBox_findpeaks_options) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_findpeaks_min_interval.sizePolicy().hasHeightForWidth()) + self.lineEdit_findpeaks_min_interval.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_findpeaks_min_interval.setFont(font) + self.lineEdit_findpeaks_min_interval.setPlaceholderText("") + self.lineEdit_findpeaks_min_interval.setObjectName("lineEdit_findpeaks_min_interval") + self.gridLayout_21.addWidget(self.lineEdit_findpeaks_min_interval, 0, 1, 1, 1) + self.lineEdit_findpeaks_min_height = QtWidgets.QLineEdit(self.groupBox_findpeaks_options) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.lineEdit_findpeaks_min_height.sizePolicy().hasHeightForWidth()) + self.lineEdit_findpeaks_min_height.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.lineEdit_findpeaks_min_height.setFont(font) + self.lineEdit_findpeaks_min_height.setPlaceholderText("") + self.lineEdit_findpeaks_min_height.setObjectName("lineEdit_findpeaks_min_height") + self.gridLayout_21.addWidget(self.lineEdit_findpeaks_min_height, 0, 3, 1, 1) + self.verticalLayout_left.addWidget(self.groupBox_findpeaks_options) + spacerItem11 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_left.addItem(spacerItem11) + self.pushButton_outputLabel = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_outputLabel.sizePolicy().hasHeightForWidth()) + self.pushButton_outputLabel.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.pushButton_outputLabel.setFont(font) + self.pushButton_outputLabel.setObjectName("pushButton_outputLabel") + self.verticalLayout_left.addWidget(self.pushButton_outputLabel) + self.verticalLayout_left.setStretch(0, 10) + self.verticalLayout_left.setStretch(1, 2) + self.verticalLayout_left.setStretch(2, 6) + self.verticalLayout_left.setStretch(3, 2) + self.verticalLayout_left.setStretch(6, 2) + self.horizontalLayout.addLayout(self.verticalLayout_left) + self.verticalLayout_canvas = QtWidgets.QVBoxLayout() + self.verticalLayout_canvas.setObjectName("verticalLayout_canvas") + self.horizontalLayout.addLayout(self.verticalLayout_canvas) + self.verticalLayout_right = QtWidgets.QVBoxLayout() + self.verticalLayout_right.setObjectName("verticalLayout_right") + self.groupBox_labelDisplay = QtWidgets.QGroupBox(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_labelDisplay.sizePolicy().hasHeightForWidth()) + self.groupBox_labelDisplay.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(10) + self.groupBox_labelDisplay.setFont(font) + self.groupBox_labelDisplay.setObjectName("groupBox_labelDisplay") + self.gridLayout_55 = QtWidgets.QGridLayout(self.groupBox_labelDisplay) + self.gridLayout_55.setObjectName("gridLayout_55") + self.tableWidget_label2 = QtWidgets.QTableWidget(self.groupBox_labelDisplay) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.tableWidget_label2.setFont(font) + self.tableWidget_label2.setColumnCount(1) + self.tableWidget_label2.setObjectName("tableWidget_label2") + self.tableWidget_label2.setRowCount(0) + self.gridLayout_55.addWidget(self.tableWidget_label2, 0, 1, 1, 1) + self.tableWidget_label1 = QtWidgets.QTableWidget(self.groupBox_labelDisplay) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(12) + self.tableWidget_label1.setFont(font) + self.tableWidget_label1.setRowCount(0) + self.tableWidget_label1.setColumnCount(1) + self.tableWidget_label1.setObjectName("tableWidget_label1") + self.tableWidget_label1.horizontalHeader().setCascadingSectionResizes(False) + self.tableWidget_label1.verticalHeader().setVisible(True) + self.tableWidget_label1.verticalHeader().setStretchLastSection(False) + self.gridLayout_55.addWidget(self.tableWidget_label1, 0, 0, 1, 1) + self.verticalLayout_right.addWidget(self.groupBox_labelDisplay) + self.groupBox_info = QtWidgets.QGroupBox(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_info.sizePolicy().hasHeightForWidth()) + self.groupBox_info.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(10) + self.groupBox_info.setFont(font) + self.groupBox_info.setObjectName("groupBox_info") + self.gridLayout_64 = QtWidgets.QGridLayout(self.groupBox_info) + self.gridLayout_64.setObjectName("gridLayout_64") + self.label_label2_length = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_label2_length.sizePolicy().hasHeightForWidth()) + self.label_label2_length.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_label2_length.setFont(font) + self.label_label2_length.setAlignment(QtCore.Qt.AlignCenter) + self.label_label2_length.setObjectName("label_label2_length") + self.gridLayout_64.addWidget(self.label_label2_length, 1, 4, 1, 1) + self.label = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) + self.label.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label.setFont(font) + self.label.setAlignment(QtCore.Qt.AlignCenter) + self.label.setObjectName("label") + self.gridLayout_64.addWidget(self.label, 0, 0, 1, 1) + self.label_label1_length = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_label1_length.sizePolicy().hasHeightForWidth()) + self.label_label1_length.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_label1_length.setFont(font) + self.label_label1_length.setAlignment(QtCore.Qt.AlignCenter) + self.label_label1_length.setObjectName("label_label1_length") + self.gridLayout_64.addWidget(self.label_label1_length, 1, 1, 1, 1) + self.label_2 = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) + self.label_2.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_2.setFont(font) + self.label_2.setAlignment(QtCore.Qt.AlignCenter) + self.label_2.setObjectName("label_2") + self.gridLayout_64.addWidget(self.label_2, 1, 0, 1, 1) + self.label_data1_length = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_data1_length.sizePolicy().hasHeightForWidth()) + self.label_data1_length.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_data1_length.setFont(font) + self.label_data1_length.setAlignment(QtCore.Qt.AlignCenter) + self.label_data1_length.setObjectName("label_data1_length") + self.gridLayout_64.addWidget(self.label_data1_length, 0, 1, 1, 1) + spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_64.addItem(spacerItem12, 0, 2, 1, 1) + self.label_21 = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_21.sizePolicy().hasHeightForWidth()) + self.label_21.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_21.setFont(font) + self.label_21.setAlignment(QtCore.Qt.AlignCenter) + self.label_21.setObjectName("label_21") + self.gridLayout_64.addWidget(self.label_21, 1, 3, 1, 1) + self.label_20 = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth()) + self.label_20.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_20.setFont(font) + self.label_20.setAlignment(QtCore.Qt.AlignCenter) + self.label_20.setObjectName("label_20") + self.gridLayout_64.addWidget(self.label_20, 0, 3, 1, 1) + self.label_data2_length = QtWidgets.QLabel(self.groupBox_info) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_data2_length.sizePolicy().hasHeightForWidth()) + self.label_data2_length.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setFamily("Times New Roman") + font.setPointSize(14) + self.label_data2_length.setFont(font) + self.label_data2_length.setAlignment(QtCore.Qt.AlignCenter) + self.label_data2_length.setObjectName("label_data2_length") + self.gridLayout_64.addWidget(self.label_data2_length, 0, 4, 1, 1) + self.textBrowser_infoOutput = QtWidgets.QTextBrowser(self.groupBox_info) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(10) + self.textBrowser_infoOutput.setFont(font) + self.textBrowser_infoOutput.setObjectName("textBrowser_infoOutput") + self.gridLayout_64.addWidget(self.textBrowser_infoOutput, 2, 0, 1, 5) + spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.gridLayout_64.addItem(spacerItem13, 1, 2, 1, 1) + self.gridLayout_64.setColumnMinimumWidth(0, 1) + self.gridLayout_64.setColumnMinimumWidth(1, 1) + self.gridLayout_64.setColumnMinimumWidth(2, 20) + self.gridLayout_64.setColumnMinimumWidth(3, 1) + self.gridLayout_64.setColumnMinimumWidth(4, 1) + self.gridLayout_64.setColumnStretch(0, 1) + self.gridLayout_64.setColumnStretch(1, 1) + self.gridLayout_64.setColumnStretch(2, 20) + self.gridLayout_64.setColumnStretch(3, 1) + self.gridLayout_64.setColumnStretch(4, 1) + self.verticalLayout_right.addWidget(self.groupBox_info) + self.verticalLayout_right.setStretch(0, 7) + self.verticalLayout_right.setStretch(1, 3) + self.horizontalLayout.addLayout(self.verticalLayout_right) + self.horizontalLayout.setStretch(0, 5) + self.horizontalLayout.setStretch(1, 20) + self.horizontalLayout.setStretch(2, 3) + self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 3, 2) + MainWindow.setCentralWidget(self.centralwidget) + self.action_selectPath = QtWidgets.QAction(MainWindow) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.action_selectPath.setFont(font) + self.action_selectPath.setObjectName("action_selectPath") + self.action = QtWidgets.QAction(MainWindow) + font = QtGui.QFont() + font.setFamily("黑体") + font.setPointSize(14) + self.action.setFont(font) + self.action.setObjectName("action") + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "Label_Check")) + self.groupBox_inputSetting.setTitle(_translate("MainWindow", "导入操作")) + self.lineEdit_rootpath.setPlaceholderText(_translate("MainWindow", "数据根目录路径")) + self.label_choose.setText(_translate("MainWindow", "数据和标签的序号选择:")) + self.radioButton_inputMode_auto.setText(_translate("MainWindow", "输入数据根目录自动识别")) + self.groupBox_label2.setTitle(_translate("MainWindow", "标签2")) + self.lineEdit_label2path.setPlaceholderText(_translate("MainWindow", "标签2路径")) + self.pushButton_label2path_open.setText(_translate("MainWindow", "浏览")) + self.groupBox_label1.setTitle(_translate("MainWindow", "标签1")) + self.lineEdit_label1path.setPlaceholderText(_translate("MainWindow", "标签1路径")) + self.pushButton_label1path_open.setText(_translate("MainWindow", "浏览")) + self.groupBox_data1.setTitle(_translate("MainWindow", "数据1")) + self.lineEdit_data1path.setPlaceholderText(_translate("MainWindow", "数据1路径")) + self.groupBox_data1_preprocess.setTitle(_translate("MainWindow", "预处理")) + self.label_data1_fillterFrequency.setText(_translate("MainWindow", "f(Hz):")) + self.label_data1_fillterNum.setText(_translate("MainWindow", "n:")) + self.lineEdit_data1_fillterFrequency_min.setText(_translate("MainWindow", "2")) + self.lineEdit_data1_fillterNum.setText(_translate("MainWindow", "2")) + self.lineEdit_data1_fillterFrequency_max.setText(_translate("MainWindow", "10")) + self.label_3.setText(_translate("MainWindow", "~")) + self.radioButton_data1_fillterMode.setText(_translate("MainWindow", "滤波器")) + self.pushButton_data1path_open.setText(_translate("MainWindow", "浏览")) + self.pushButton_rootpath_open.setText(_translate("MainWindow", "浏览")) + self.label_frequency.setText(_translate("MainWindow", "频率:")) + self.lineEdit_frequency.setText(_translate("MainWindow", "1000")) + self.label_frequency_Hz.setText(_translate("MainWindow", "Hz")) + self.pushButton_dataInput.setText(_translate("MainWindow", "导入")) + self.groupBox_data2.setTitle(_translate("MainWindow", "数据2")) + self.lineEdit_data2path.setPlaceholderText(_translate("MainWindow", "数据2路径")) + self.pushButton_data2path_open.setText(_translate("MainWindow", "浏览")) + self.groupBox_data2_preprocess.setTitle(_translate("MainWindow", "预处理")) + self.label_data2_fillterFrequency.setText(_translate("MainWindow", "f(Hz):")) + self.label_data2_fillterNum.setText(_translate("MainWindow", "n:")) + self.lineEdit_data2_fillterFrequency_min.setText(_translate("MainWindow", "2")) + self.lineEdit_data2_fillterNum.setText(_translate("MainWindow", "2")) + self.lineEdit_data2_fillterFrequency_max.setText(_translate("MainWindow", "15")) + self.label_4.setText(_translate("MainWindow", "~")) + self.radioButton_data2_fillterMode.setText(_translate("MainWindow", "滤波器")) + self.radioButton_inputMode_manual.setText(_translate("MainWindow", "手动输入路径")) + self.groupBox_save.setTitle(_translate("MainWindow", "保存路径")) + self.lineEdit_savepath.setPlaceholderText(_translate("MainWindow", "纠正后J峰保存路径")) + self.pushButton_savepath_open.setText(_translate("MainWindow", "浏览")) + self.groupBox_autoplay.setTitle(_translate("MainWindow", "自动播放")) + self.groupBox_move_setting.setTitle(_translate("MainWindow", "设置")) + self.radioButton_move_preset_3.setText(_translate("MainWindow", "预设3")) + self.lineEdit_moveLength.setText(_translate("MainWindow", "15000")) + self.label_maxRange_preset_3.setText(_translate("MainWindow", "100000")) + self.label_moveLength_preset_3.setText(_translate("MainWindow", "25000")) + self.label_maxRange.setText(_translate("MainWindow", "最大范围")) + self.label_moveSpeed_preset_2.setText(_translate("MainWindow", "500")) + self.label_moveLength_preset_1.setText(_translate("MainWindow", "10000")) + self.label_moveSpeed_preset_1.setText(_translate("MainWindow", "500")) + self.lineEdit_maxRange.setText(_translate("MainWindow", "60000")) + self.label_maxRange_preset_2.setText(_translate("MainWindow", "80000")) + self.radioButton_move_preset_1.setText(_translate("MainWindow", "预设1")) + self.radioButton_move_preset_2.setText(_translate("MainWindow", "预设2")) + self.radioButton_move_custom.setText(_translate("MainWindow", "自定义")) + self.label_moveLength.setText(_translate("MainWindow", "移动距离")) + self.label_moveLength_preset_2.setText(_translate("MainWindow", "20000")) + self.label_maxRange_preset_1.setText(_translate("MainWindow", "40000")) + self.lineEdit_moveSpeed.setText(_translate("MainWindow", "1000")) + self.label_moveSpeed_preset_3.setText(_translate("MainWindow", "500")) + self.label_ms_2.setText(_translate("MainWindow", "ms")) + self.label_ms_4.setText(_translate("MainWindow", "ms")) + self.label_ms_3.setText(_translate("MainWindow", "ms")) + self.label_ms_1.setText(_translate("MainWindow", "ms")) + self.label_moveSpeed.setText(_translate("MainWindow", "移动间隔")) + self.groupBox_move.setTitle(_translate("MainWindow", "操作")) + self.pushButton_left_move.setText(_translate("MainWindow", "<<(A)")) + self.pushButton_pause.setText(_translate("MainWindow", "||(S)")) + self.pushButton_right_move.setText(_translate("MainWindow", ">>(D)")) + self.groupBox_findpeaks_options.setTitle(_translate("MainWindow", "批量增加的寻峰参数设置")) + self.label_6.setText(_translate("MainWindow", "最小高度:")) + self.label_5.setText(_translate("MainWindow", "最小间隔:")) + self.lineEdit_findpeaks_min_interval.setText(_translate("MainWindow", "1000")) + self.lineEdit_findpeaks_min_height.setText(_translate("MainWindow", "0.5")) + self.pushButton_outputLabel.setText(_translate("MainWindow", "导出标签")) + self.groupBox_labelDisplay.setTitle(_translate("MainWindow", "标签")) + self.groupBox_info.setTitle(_translate("MainWindow", "信息")) + self.label_label2_length.setText(_translate("MainWindow", "0")) + self.label.setText(_translate("MainWindow", "数据1长度:")) + self.label_label1_length.setText(_translate("MainWindow", "0")) + self.label_2.setText(_translate("MainWindow", "数据1标签数:")) + self.label_data1_length.setText(_translate("MainWindow", "0")) + self.label_21.setText(_translate("MainWindow", "数据2标签数:")) + self.label_20.setText(_translate("MainWindow", "数据2长度:")) + self.label_data2_length.setText(_translate("MainWindow", "0")) + self.action_selectPath.setText(_translate("MainWindow", "数据路径选择")) + self.action.setText(_translate("MainWindow", "加载存档")) diff --git a/MainWindow.ui b/MainWindow.ui new file mode 100644 index 0000000..3234c85 --- /dev/null +++ b/MainWindow.ui @@ -0,0 +1,1927 @@ + + + MainWindow + + + + 0 + 0 + 1920 + 1080 + + + + Label_Check + + + + + + + + + + + + 0 + 0 + + + + + 黑体 + 10 + + + + 导入操作 + + + + + + + 0 + 0 + + + + + Times New Roman + 10 + + + + + + + 数据根目录路径 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 数据和标签的序号选择: + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 黑体 + 14 + + + + 输入数据根目录自动识别 + + + + + + + + 0 + 0 + + + + 标签2 + + + + + + + 0 + 0 + + + + + Times New Roman + 10 + + + + 标签2路径 + + + + + + + + 黑体 + 14 + + + + 浏览 + + + + + + + + + + + 0 + 0 + + + + 标签1 + + + + + + + 0 + 0 + + + + + Times New Roman + 10 + + + + 标签1路径 + + + + + + + + 黑体 + 14 + + + + 浏览 + + + + + + + + + + + 0 + 0 + + + + 数据1 + + + + + + + 0 + 0 + + + + + Times New Roman + 10 + + + + 数据1路径 + + + + + + + 预处理 + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + f(Hz): + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + n: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + 2 + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + 2 + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + 10 + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + ~ + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 黑体 + 12 + + + + 滤波器 + + + + + + + + + + + 黑体 + 14 + + + + 浏览 + + + + + + + + + + + 黑体 + 14 + + + + 浏览 + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 频率: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 1000 + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + Hz + + + Qt::AlignCenter + + + + + + + + 黑体 + 14 + + + + 导入 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + 0 + + + + 数据2 + + + + + + + 0 + 0 + + + + + Times New Roman + 10 + + + + + + + 数据2路径 + + + + + + + + 黑体 + 14 + + + + 浏览 + + + + + + + 预处理 + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + f(Hz): + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + n: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + 2 + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + 2 + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + 15 + + + + + + + + 0 + 0 + + + + + Times New Roman + 12 + + + + ~ + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 黑体 + 12 + + + + 滤波器 + + + + + + + + + + + + + + 黑体 + 14 + + + + 手动输入路径 + + + + + + + + Times New Roman + 14 + + + + + + + + + 0 + 0 + + + + 保存路径 + + + + + + + 0 + 0 + + + + + Times New Roman + 10 + + + + 纠正后J峰保存路径 + + + + + + + + 黑体 + 14 + + + + 浏览 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 黑体 + 10 + + + + 自动播放 + + + + + + + 0 + 0 + + + + 设置 + + + + + + + 黑体 + 14 + + + + 预设3 + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 15000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 100000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 25000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 最大范围 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 500 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 10000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 500 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 60000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 80000 + + + Qt::AlignCenter + + + + + + + + 黑体 + 14 + + + + 预设1 + + + + + + + + 黑体 + 14 + + + + 预设2 + + + + + + + + 黑体 + 14 + + + + 自定义 + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 移动距离 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 20000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 40000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 1000 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 500 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + ms + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + ms + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + ms + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + ms + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 移动间隔 + + + Qt::AlignCenter + + + + + + + + + + + 0 + 0 + + + + 操作 + + + + + + + + + 0 + 0 + + + + + 黑体 + 14 + + + + <<(A) + + + + + + + + 0 + 0 + + + + + 黑体 + 14 + + + + ||(S) + + + + + + + + 0 + 0 + + + + + 黑体 + 14 + + + + >>(D) + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 黑体 + 10 + + + + 批量增加的寻峰参数设置 + + + + + + + 0 + 0 + + + + + 黑体 + 14 + + + + 最小高度: + + + + + + + + 0 + 0 + + + + + 黑体 + 14 + + + + 最小间隔: + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 1000 + + + + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 0.5 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 黑体 + 14 + + + + 导出标签 + + + + + + + + + + + + + + + 0 + 0 + + + + + 黑体 + 10 + + + + 标签 + + + + + + + Times New Roman + 12 + + + + 1 + + + + + + + + + Times New Roman + 12 + + + + 0 + + + 1 + + + false + + + true + + + false + + + + + + + + + + + + 0 + 0 + + + + + 黑体 + 10 + + + + 信息 + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 0 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 数据1长度: + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 0 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 数据1标签数: + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 0 + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 数据2标签数: + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 数据2长度: + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + Times New Roman + 14 + + + + 0 + + + Qt::AlignCenter + + + + + + + + 黑体 + 10 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + 数据路径选择 + + + + 黑体 + 14 + + + + + + 加载存档 + + + + 黑体 + 14 + + + + + + + diff --git a/README.md b/README.md index b271fce..5192243 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,16 @@ -# ecg_label_check +# ecg_label_check——人工纠正R峰标签程序 +``` +项目作者信息 +@author:Yosa +@email:2023025086@m.scnu.edu.cn +@time:2025/2/5 +``` + +本程序提供符合用户直接的操作界面,用于人工纠正ECG信号所对应的R峰坐标,可逐个或批量对标签进行增加和删除操作。 + +## TODO + +编写说明文档 + +将批量增删标签中的长按选择区域修改为伴有纵坐标判断选择区域的矩形 \ No newline at end of file diff --git a/ecg_label_check.py b/ecg_label_check.py new file mode 100644 index 0000000..8d7353a --- /dev/null +++ b/ecg_label_check.py @@ -0,0 +1,948 @@ +""" +@author:Yosa +@file:ecg_label_check.py +@email:2023025086@m.scnu.edu.cn +@time:2025/2/5 +""" + +import sys +from logging import NOTSET, getLogger, FileHandler, Formatter, StreamHandler, info, error, debug +from time import time, strftime, localtime + +import numpy as np +from PyQt5.QtGui import QFont, QDoubleValidator, QIntValidator +from matplotlib.ticker import FuncFormatter +from numpy import load, nan, zeros, append, linspace, place +from matplotlib import use +from matplotlib import pyplot as plt, gridspec +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT +from datetime import datetime +from pathlib import Path +from PyQt5.QtCore import QCoreApplication, QTimer +from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox, QButtonGroup, QApplication, QTableWidgetItem, \ + QLineEdit, QAction, QTableWidget +from scipy.signal import butter, filtfilt, find_peaks + +from MainWindow import Ui_MainWindow + +use("Qt5Agg") # 声明使用QT5 + +# 设置日志 +logger = getLogger() +logger.setLevel(NOTSET) +realtime = strftime('%Y%m%d', localtime(time())) +if not Path("logs").exists(): + Path("logs").mkdir(exist_ok=True) +fh = FileHandler(Path("logs") / (realtime + ".log"), mode='a') +fh.setLevel(NOTSET) +fh.setFormatter(Formatter("%(asctime)s: %(message)s")) +logger.addHandler(fh) + +ch = StreamHandler() +ch.setLevel(NOTSET) +ch.setFormatter(Formatter("%(asctime)s: %(message)s")) +logger.addHandler(ch) +getLogger('matplotlib.font_manager').disabled = True +info("------------------------------------") +info("---------ecg_label_check.py---------") + +class MainWindow(QMainWindow, Ui_MainWindow): + + # 全局变量初始化 + data1 = np.array([]) + data1 = data1.astype(np.float64) + data2 = np.array([]) + data2 = data2.astype(np.float64) + label1 = np.array([]) + label1 = label1.astype(np.int64) + label2 = np.array([]) + label2 = label2.astype(np.int64) + + # 程序初始化操作 + def __init__(self): + super(MainWindow, self).__init__() + self.setupUi(self) + + # 设置画框 + self.figure = plt.figure(figsize=(12, 6), dpi=150) + self.canvas = FigureCanvasQTAgg(self.figure) + self.figToolbar = CustomNavigationToolbar(self.canvas, self) + self.verticalLayout_canvas.addWidget(self.canvas) + self.verticalLayout_canvas.addWidget(self.figToolbar) + self.figToolbar._actions['home'].triggered.connect(self.toggle_home) + self.figToolbar.action_Label_Single.triggered.connect(self.toggle_changeLabel_Single_mode) + self.figToolbar.action_Label_Multiple.triggered.connect(self.toggle_changeLabel_Multiple_mode) + + # 画框子图初始化 + self.gs = gridspec.GridSpec(2, 1, height_ratios=[1, 1]) + self.figure.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) + plt.margins(0, 0) + plt.tight_layout() + plt.xticks([]) + plt.yticks([]) + + # 单选框组件分组 + self.buttonGroup_inputMode = QButtonGroup() + self.buttonGroup_inputMode.addButton(self.radioButton_inputMode_auto) + self.buttonGroup_inputMode.addButton(self.radioButton_inputMode_manual) + self.buttonGroup_data1_preprocess = QButtonGroup() + self.buttonGroup_data1_preprocess.addButton(self.radioButton_data1_fillterMode) + self.buttonGroup_data2_preprocess = QButtonGroup() + self.buttonGroup_data2_preprocess.addButton(self.radioButton_data2_fillterMode) + self.buttonGroup_move_preset = QButtonGroup() + self.buttonGroup_move_preset.addButton(self.radioButton_move_preset_1) + self.buttonGroup_move_preset.addButton(self.radioButton_move_preset_2) + self.buttonGroup_move_preset.addButton(self.radioButton_move_preset_3) + self.buttonGroup_move_preset.addButton(self.radioButton_move_custom) + + # 设置表格属性 + self.tableWidget_label1.setHorizontalHeaderLabels(['label1']) + self.tableWidget_label2.setHorizontalHeaderLabels(['label2']) + self.tableWidget_label1.setEditTriggers(QTableWidget.NoEditTriggers) + self.tableWidget_label2.setEditTriggers(QTableWidget.NoEditTriggers) + + # 槽函数连接控件初始化 + self.pushButton_savepath_open.clicked.connect(self.slot_btn_selectPath) + self.pushButton_rootpath_open.clicked.connect(self.slot_btn_selectPath) + self.pushButton_data1path_open.clicked.connect(self.slot_btn_selectPath) + self.pushButton_data2path_open.clicked.connect(self.slot_btn_selectPath) + self.pushButton_label1path_open.clicked.connect(self.slot_btn_selectPath) + self.pushButton_label2path_open.clicked.connect(self.slot_btn_selectPath) + self.pushButton_dataInput.clicked.connect(self.slot_btn_dataInput) + self.pushButton_outputLabel.clicked.connect(self.slot_btn_outputLabel) + self.comboBox_choose.currentTextChanged.connect(self.slot_comboBox_textChanged) + self.radioButton_inputMode_auto.clicked.connect(self.slot_radioBtn_inputMode_auto) + self.radioButton_inputMode_manual.clicked.connect(self.slot_radioBtn_inputMode_manual) + self.pushButton_left_move.clicked.connect(self.slot_btn_left_move) + self.pushButton_pause.clicked.connect(self.slot_btn_pause) + self.pushButton_right_move.clicked.connect(self.slot_btn_right_move) + self.radioButton_move_preset_1.clicked.connect(self.slot_radioBtn_move_preset_1) + self.radioButton_move_preset_2.clicked.connect(self.slot_radioBtn_move_preset_2) + self.radioButton_move_preset_3.clicked.connect(self.slot_radioBtn_move_preset_3) + self.radioButton_move_custom.clicked.connect(self.slot_radioBtn_move_custom) + self.tableWidget_label1.cellDoubleClicked.connect(self.slot_tableWidget_1_on_cell_double_clicked) + self.tableWidget_label2.cellDoubleClicked.connect(self.slot_tableWidget_2_on_cell_double_clicked) + + # 初始化按钮快捷键 + self.pushButton_left_move.setShortcut(QCoreApplication.translate("MainWindow", "A")) + self.pushButton_pause.setShortcut(QCoreApplication.translate("MainWindow", "S")) + self.pushButton_right_move.setShortcut(QCoreApplication.translate("MainWindow", "D")) + + # 界面控件状态初始化 + self.lineEdit_rootpath.setEnabled(False) + self.lineEdit_savepath.setEnabled(False) + self.lineEdit_data1path.setEnabled(False) + self.lineEdit_data2path.setEnabled(False) + self.lineEdit_label1path.setEnabled(False) + self.lineEdit_label2path.setEnabled(False) + self.label_choose.setEnabled(False) + self.comboBox_choose.setEnabled(False) + self.groupBox_save.setEnabled(False) + self.groupBox_data1.setEnabled(False) + self.groupBox_data2.setEnabled(False) + self.groupBox_label1.setEnabled(False) + self.groupBox_label2.setEnabled(False) + self.groupBox_autoplay.setEnabled(False) + self.groupBox_labelDisplay.setEnabled(False) + self.radioButton_inputMode_auto.setChecked(True) + self.radioButton_data1_fillterMode.setChecked(True) + self.radioButton_data2_fillterMode.setChecked(True) + self.radioButton_move_preset_1.setChecked(True) + self.pushButton_outputLabel.setEnabled(False) + self.figToolbar.action_Label_Single.setEnabled(False) + self.figToolbar.action_Label_Multiple.setEnabled(False) + for action in self.figToolbar._actions.values(): + action.setEnabled(False) + + # 消息弹窗初始化 + self.msgBox = QMessageBox() + self.msgBox.setWindowTitle("消息") + + # 自动播放参数初始化 + self.autoplay_mode = "pause" + self.autoplay_moveLength = int(self.label_moveLength_preset_1.text()) + self.autoplay_maxRange = int(self.label_maxRange_preset_1.text()) + self.autoplay_moveSpeed = int(self.label_moveSpeed_preset_1.text()) + + # 初始化自动播放定时器 + self.timer_autoplay = QTimer() + self.timer_autoplay.timeout.connect(self.autoplay_move_xlim) + + # 绘图工具初始化 + self.points_y = np.array([]) + self.temp_point = None + self.is_left_button_pressed = False + self.is_right_button_pressed = False + + # 定义验证器,用于规范lineEdit的输入内容 + validator_double = QDoubleValidator(-1e100, 1e100, 10) + validator_integer = QIntValidator(-2**31, 2**31 - 1) + self.lineEdit_data1_fillterNum.setValidator(validator_integer) + self.lineEdit_data2_fillterNum.setValidator(validator_integer) + self.lineEdit_data1_fillterFrequency_min.setValidator(validator_double) + self.lineEdit_data1_fillterFrequency_max.setValidator(validator_double) + self.lineEdit_data2_fillterFrequency_min.setValidator(validator_double) + self.lineEdit_data2_fillterFrequency_max.setValidator(validator_double) + self.lineEdit_frequency.setValidator(validator_double) + self.lineEdit_moveLength.setValidator(validator_integer) + self.lineEdit_maxRange.setValidator(validator_double) + self.lineEdit_moveSpeed.setValidator(validator_integer) + self.lineEdit_findpeaks_min_interval.setValidator(validator_integer) + self.lineEdit_findpeaks_min_height.setValidator(validator_double) + + self.textBrowser_update("程序启动成功,导入数据以开始任务") + info("Program Started.") + + def slot_btn_selectPath(self): + fileDialog = QFileDialog() + if self.sender() == self.pushButton_rootpath_open: + fileDialog.setFileMode(QFileDialog.Directory) + fileDialog.setOption(QFileDialog.ShowDirsOnly, True) + if fileDialog.exec_() == QFileDialog.Accepted: + file_path = fileDialog.selectedFiles()[0] + if not file_path: + error("Root Path not Exist...") + self.textBrowser_update("操作:根目录路径输入错误") + self.msgBox.setText("根目录路径输入错误") + self.msgBox.setIcon(QMessageBox.Critical) + self.msgBox.exec() + return + + self.lineEdit_rootpath.setText(file_path) + file_path = Path(file_path) + info("Loading Root Path...") + self.data_and_label_Path = file_path / "label" + + if self.data_and_label_Path.exists(): + # 检查路径下的hecg.txt和hRpeak.txt文件是否一一对应 + data_files = sorted(self.data_and_label_Path.glob('*ecg.txt')) + label_files = sorted(self.data_and_label_Path.glob('*Rpeak.txt')) + if len(data_files) != len(label_files): + error("Data Quantity not Match...") + self.textBrowser_update(f"操作:数据导入错误,ecg.txt和Rpeak.txt文件数量不匹配,分别是{str(len(data_files))}和{str(len(label_files))}") + self.msgBox.setText(f"数据导入错误,ecg.txt和Rpeak.txt文件数量不匹配,分别是{str(len(data_files))}和{str(len(label_files))}") + self.msgBox.setIcon(QMessageBox.Critical) + self.msgBox.exec() + return + for data_file, label_file in zip(data_files, label_files): + if data_file.stem.replace('ecg', '') != label_file.stem.replace('Rpeak', ''): + self.textBrowser_update(f"操作:数据导入错误,文件名称存在不匹配,分别是{str(data_file.stem)}和{str(label_file.stem)}") + self.msgBox.setText(f"操作:数据导入错误,文件名称存在不匹配,分别是{str(data_file.stem)}和{str(label_file.stem)}") + self.msgBox.setIcon(QMessageBox.Critical) + self.msgBox.exec() + return + nums_for_comboBox = np.array([]) + for data_file in data_files: + prefix = data_file.stem.replace('ecg', '') + nums_for_comboBox = np.append(nums_for_comboBox, prefix) + nums_for_comboBox = nums_for_comboBox.astype(np.int8) + nums_for_comboBox.sort() + nums_for_comboBox = nums_for_comboBox.astype(str) + self.comboBox_choose.clear() + self.comboBox_choose.addItems(nums_for_comboBox) + self.label_choose.setEnabled(True) + self.comboBox_choose.setEnabled(True) + self.groupBox_save.setEnabled(True) + self.groupBox_data1.setEnabled(True) + self.groupBox_data2.setEnabled(True) + self.groupBox_label1.setEnabled(True) + self.groupBox_label2.setEnabled(True) + + # 更新数据路径文本框 + self.lineEdit_savepath.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "location_J.txt") + self.lineEdit_data1path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "ecg.txt") + self.lineEdit_data2path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "ecg.txt") + self.lineEdit_label1path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "Rpeak.txt") + self.lineEdit_label2path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "Rpeak.txt") + + MainWindow.setWindowTitle(self, QCoreApplication.translate("MainWindow", + "Label_Check - Data Path: " + str(file_path))) + info("Successfully Loaded Root Path.") + self.textBrowser_update("操作:根目录路径选择成功") + else: + info("Failed to Load Root Path.") + self.textBrowser_update("操作:根目录路径选择错误,缺乏必要数据文件夹") + self.msgBox.setText("根目录路径选择错误,缺乏必要数据文件夹") + self.msgBox.setIcon(QMessageBox.Critical) + self.msgBox.exec() + return + else: + info("Canceled Loading Root Path.") + self.textBrowser_update("提示:根目录路径选择取消") + self.msgBox.setText("根目录路径选择取消") + self.msgBox.setIcon(QMessageBox.Warning) + self.msgBox.exec() + elif self.sender() == self.pushButton_savepath_open: + fileDialog.setFileMode(QFileDialog.Directory) + fileDialog.setOption(QFileDialog.ShowDirsOnly, True) + if fileDialog.exec_() == QFileDialog.Accepted: + file_path = fileDialog.selectedFiles()[0] + self.lineEdit_savepath.setText(str(Path(file_path) / "newlocation_J.txt")) + info("Successfully Loaded Save Path.") + self.textBrowser_update("操作:保存路径选择成功") + else: + info("Canceled Loading Save Path.") + self.textBrowser_update("提示:保存路径选择取消") + self.msgBox.setText("保存路径选择取消") + self.msgBox.setIcon(QMessageBox.Warning) + self.msgBox.exec() + else: + fileDialog.setFileMode(QFileDialog.ExistingFile) + fileDialog.setOption(QFileDialog.ReadOnly, True) + fileDialog.setNameFilter("Text Files (*.txt)") + if fileDialog.exec_() == QFileDialog.Accepted: + file_path = fileDialog.selectedFiles()[0] + if self.sender() == self.pushButton_data1path_open: + self.lineEdit_data1path.setText(file_path) + elif self.sender() == self.pushButton_data2path_open: + self.lineEdit_data2path.setText(file_path) + elif self.sender() == self.pushButton_label1path_open: + self.lineEdit_label1path.setText(file_path) + elif self.sender() == self.pushButton_label2path_open: + self.lineEdit_label2path.setText(file_path) + info("Successfully Loaded Data Path.") + self.textBrowser_update("操作:数据路径选择成功") + else: + info("Canceled Loading Data Path.") + self.textBrowser_update("提示:数据路径选择取消") + self.msgBox.setText("数据路径选择取消") + self.msgBox.setIcon(QMessageBox.Warning) + self.msgBox.exec() + + def slot_btn_dataInput(self): + info("Inputing Data...") + self.textBrowser_update("提示:开始导入数据") + # 导入数据 + self.label1 = np.array([]) + self.label2 = np.array([]) + file = open(str(self.lineEdit_data1path.text()), 'r') + self.data1 = file.readlines() + self.data1 = list(map(float, self.data1)) + self.data2 = self.data1 + self.data1 = self.data_preprocess(self.data1, int(self.lineEdit_data1_fillterNum.text()), + float(self.lineEdit_data1_fillterFrequency_min.text()), + float(self.lineEdit_data1_fillterFrequency_max.text()), + float(self.lineEdit_frequency.text())) + self.data2 = self.data_preprocess(self.data2, int(self.lineEdit_data2_fillterNum.text()), + float(self.lineEdit_data2_fillterFrequency_min.text()), + float(self.lineEdit_data2_fillterFrequency_max.text()), + float(self.lineEdit_frequency.text())) + file = open(str(self.lineEdit_label1path.text()), 'r') + self.label1 = np.array(file.readlines()) + self.label2 = self.label1 + self.data1 = self.data1.astype(np.float64) + self.data2 = self.data2.astype(np.float64) + self.label1 = self.label1.astype(np.int64) + self.label2 = self.label2.astype(np.int64) + self.points_y_1 = [self.data1[x] for x in self.label1] + self.points_y_2 = [self.data2[x] for x in self.label2] + + # 更新tableWidget + self.tableWidget_label1.setRowCount(len(self.label1)) + for row, value in enumerate(self.label1): + item = QTableWidgetItem(str(value).strip()) + self.tableWidget_label1.setItem(row, 0, item) + self.tableWidget_label2.setRowCount(self.label2.__len__()) + for row, value in enumerate(self.label2): + item = QTableWidgetItem(str(value).strip()) + self.tableWidget_label2.setItem(row, 0, item) + self.groupBox_labelDisplay.setEnabled(True) + + # 更新界面 + self.groupBox_inputSetting.setEnabled(False) + self.groupBox_autoplay.setEnabled(True) + self.pushButton_outputLabel.setEnabled(True) + self.figToolbar.action_Label_Single.setEnabled(True) + self.figToolbar.action_Label_Multiple.setEnabled(True) + for action in self.figToolbar._actions.values(): + action.setEnabled(True) + + # 更新信息 + self.label_data1_length.setText(str(len(self.data1))) + self.label_data2_length.setText(str(len(self.data2))) + self.label_label1_length.setText(str(len(self.label1))) + self.label_label2_length.setText(str(len(self.label2))) + + # 更新画框 + self.figure.clear() + self.plot_data_and_label() + + # 连接画框中的槽函数 + # Connect mouse events + self.canvas.mpl_connect('motion_notify_event', self.on_motion) + + # 保存路径文件是否存在的检查 + if not Path(self.lineEdit_savepath.text()).exists(): + Path(self.lineEdit_savepath.text()).touch() + + info("Finished Input Data.") + self.textBrowser_update("提示:导入数据完成") + + def slot_radioBtn_inputMode_auto(self): + self.pushButton_rootpath_open.setEnabled(True) + self.label_choose.setEnabled(False) + self.comboBox_choose.setEnabled(False) + self.groupBox_save.setEnabled(False) + self.groupBox_data1.setEnabled(False) + self.groupBox_data2.setEnabled(False) + self.groupBox_label1.setEnabled(False) + self.groupBox_label2.setEnabled(False) + self.lineEdit_savepath.setText("") + self.lineEdit_rootpath.setText("") + self.lineEdit_data1path.setText("") + self.lineEdit_data2path.setText("") + self.lineEdit_label1path.setText("") + self.lineEdit_label2path.setText("") + self.comboBox_choose.clear() + info("Switched to inputMode_auto.") + self.textBrowser_update("操作:切换到输入模式-自动识别") + + def slot_radioBtn_inputMode_manual(self): + self.pushButton_rootpath_open.setEnabled(False) + self.label_choose.setEnabled(False) + self.comboBox_choose.setEnabled(False) + self.groupBox_save.setEnabled(True) + self.groupBox_data1.setEnabled(True) + self.groupBox_data2.setEnabled(True) + self.groupBox_label1.setEnabled(True) + self.groupBox_label2.setEnabled(True) + self.lineEdit_rootpath.setText("") + self.comboBox_choose.clear() + info("Switched to inputMode_manual.") + self.textBrowser_update("操作:切换到输入模式-手动输入") + + def slot_comboBox_textChanged(self): + # 更新数据路径文本框 + self.lineEdit_savepath.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "location_J.txt") + self.lineEdit_data1path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "ecg.txt") + self.lineEdit_data2path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "ecg.txt") + self.lineEdit_label1path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "Rpeak.txt") + self.lineEdit_label2path.setText( + str(self.data_and_label_Path) + "\\" + self.comboBox_choose.currentText() + "Rpeak.txt") + + def slot_btn_left_move(self): + self.autoplay_mode = "left" + self.autoplay_xlim_start = int(self.ax0.get_xlim()[1] - self.autoplay_maxRange) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[1]) + if self.autoplay_xlim_end > self.data2.__len__(): + self.autoplay_xlim_start = int(self.data2.__len__() - self.autoplay_maxRange) + self.autoplay_xlim_end = int(self.data2.__len__()) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + self.timer_autoplay.start(self.autoplay_moveSpeed) + info("Started Autoplay left_mode.") + self.textBrowser_update("操作:开始自动播放-向左") + + def slot_btn_pause(self): + self.autoplay_mode = "pause" + self.timer_autoplay.stop() + info("Paused Autoplay.") + self.textBrowser_update("操作:暂停自动播放") + + def slot_btn_right_move(self): + self.autoplay_mode = "right" + self.autoplay_xlim_start = int(self.ax0.get_xlim()[0]) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[0] + self.autoplay_maxRange) + if self.autoplay_xlim_start < 0: + self.autoplay_xlim_start = 0 + self.autoplay_xlim_end = 0 + self.autoplay_maxRange + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + self.timer_autoplay.start(self.autoplay_moveSpeed) + info("Started Autoplay right_mode.") + self.textBrowser_update("操作:开始自动播放-向右") + + def slot_radioBtn_move_preset_1(self): + self.autoplay_moveLength = int(self.label_moveLength_preset_1.text()) + self.autoplay_maxRange = int(self.label_maxRange_preset_1.text()) + self.autoplay_moveSpeed = int(self.label_moveSpeed_preset_1.text()) + if self.autoplay_mode != "pause": + if self.autoplay_mode == "right": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[0]) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[0] + self.autoplay_maxRange) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + elif self.autoplay_mode == "left": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[1] - self.autoplay_maxRange) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[1]) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + self.timer_autoplay.start(self.autoplay_moveSpeed) + info("Switched to Autoplay preset_1.") + self.textBrowser_update("操作:切换到自动播放-预设1") + + def slot_radioBtn_move_preset_2(self): + self.autoplay_moveLength = int(self.label_moveLength_preset_2.text()) + self.autoplay_maxRange = int(self.label_maxRange_preset_2.text()) + self.autoplay_moveSpeed = int(self.label_moveSpeed_preset_2.text()) + if self.autoplay_mode != "pause": + if self.autoplay_mode == "right": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[0]) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[0] + self.autoplay_maxRange) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + elif self.autoplay_mode == "left": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[1] - self.autoplay_maxRange) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[1]) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + self.timer_autoplay.start(self.autoplay_moveSpeed) + info("Switched to Autoplay preset_2.") + self.textBrowser_update("操作:切换到自动播放-预设2") + + def slot_radioBtn_move_preset_3(self): + self.autoplay_moveLength = int(self.label_moveLength_preset_3.text()) + self.autoplay_maxRange = int(self.label_maxRange_preset_3.text()) + self.autoplay_moveSpeed = int(self.label_moveSpeed_preset_3.text()) + if self.autoplay_mode != "pause": + if self.autoplay_mode == "right": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[0]) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[0] + self.autoplay_maxRange) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + elif self.autoplay_mode == "left": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[1] - self.autoplay_maxRange) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[1]) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + self.timer_autoplay.start(self.autoplay_moveSpeed) + info("Switched to Autoplay preset_3.") + self.textBrowser_update("操作:切换到自动播放-预设3") + + def slot_radioBtn_move_custom(self): + self.autoplay_moveLength = int(self.lineEdit_moveLength.text()) + self.autoplay_maxRange = int(self.lineEdit_maxRange.text()) + self.autoplay_moveSpeed = int(self.lineEdit_moveSpeed.text()) + if self.autoplay_mode != "pause": + if self.autoplay_mode == "right": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[0]) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[0] + self.autoplay_maxRange) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + elif self.autoplay_mode == "left": + self.autoplay_xlim_start = int(self.ax0.get_xlim()[1] - self.autoplay_maxRange) + self.autoplay_xlim_end = int(self.ax0.get_xlim()[1]) + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + self.timer_autoplay.start(self.autoplay_moveSpeed) + info("Switched to Autoplay custom.") + self.textBrowser_update("操作:切换到自动播放-自定义") + self.msgBox.setText("自定义的输入参数未做任何检查,请斟酌输入参数,否则可能会导致程序异常") + self.msgBox.setIcon(QMessageBox.Warning) + self.msgBox.exec() + + def slot_tableWidget_1_on_cell_double_clicked(self, row, column): + x = float(self.tableWidget_label1.item(row, column).text()) + self.ax0.set_xlim(x - 5000, x + 5000) + self.annotation_tableWidget = self.ax0.annotate(f'x={int(x)}', xy=(int(x), self.ax0.get_ylim()[0]), xytext=(int(x), self.ax0.get_ylim()[0] + (self.ax0.get_ylim()[1] - self.ax0.get_ylim()[0]) * 0.1), + arrowprops=dict(facecolor='black', shrink=0.1)) + self.canvas.draw() + info(f"Jumped to x_axis: {str(int(x))}.") + self.textBrowser_update(f"操作:跳转到x坐标: {str(int(x))}") + + def slot_tableWidget_2_on_cell_double_clicked(self, row, column): + x = float(self.tableWidget_label2.item(row, column).text()) + self.ax0.set_xlim(x - 5000, x + 5000) + self.annotation_tableWidget = self.ax0.annotate(f'x={int(x)}', xy=(int(x), self.ax0.get_ylim()[0]), xytext=(int(x), self.ax0.get_ylim()[0] + (self.ax0.get_ylim()[1] - self.ax0.get_ylim()[0]) * 0.1), + arrowprops=dict(facecolor='black', shrink=0.1)) + self.canvas.draw() + info(f"Jumped to x_axis: {str(int(x))}.") + self.textBrowser_update(f"操作:跳转到x坐标: {str(int(x))}") + + def slot_btn_outputLabel(self): + np.savetxt(Path(self.lineEdit_savepath.text()), self.label2, fmt='%d', newline='\n') + info(f"Manually Saved Data to: {str(Path(self.lineEdit_savepath.text()))}.") + self.textBrowser_update(f"操作:手动保存数据至{str(Path(self.lineEdit_savepath.text()))}") + + def data_preprocess(self, data, n, f1, f2, fs): + f1 = f1 / (fs / 2.0) + f2 = f2 / (fs / 2.0) + b, a = butter(n, [f1, f2], btype = 'bandpass') + data = np.array(filtfilt(b, a, data)) + return data + + def update_tableWidget_and_info(self): + self.tableWidget_label2.setRowCount(self.label2.__len__()) + for row, value in enumerate(self.label2): + item = QTableWidgetItem(str(value).strip()) + self.tableWidget_label2.setItem(row, 0, item) + self.groupBox_labelDisplay.setEnabled(True) + self.label_label2_length.setText(str(len(self.label2))) + + def textBrowser_update(self, message): + self.textBrowser_infoOutput.append(str(datetime.now().strftime("%H:%M:%S")) + ": " + message) + + def autoplay_move_xlim(self): + if self.autoplay_mode == "left" and self.autoplay_xlim_start < 0: + self.autoplay_mode = "pause" + self.timer_autoplay.stop() + info("Paused Autoplay.") + self.textBrowser_update("操作:暂停自动播放") + elif self.autoplay_mode == "right" and self.autoplay_xlim_end > self.data2.__len__(): + self.autoplay_mode = "pause" + self.timer_autoplay.stop() + info("Paused Autoplay.") + self.textBrowser_update("操作:暂停自动播放") + else: + if self.autoplay_mode == "right": + self.autoplay_xlim_start += self.autoplay_moveLength + self.autoplay_xlim_end += self.autoplay_moveLength + elif self.autoplay_mode == "left": + self.autoplay_xlim_start -= self.autoplay_moveLength + self.autoplay_xlim_end -= self.autoplay_moveLength + self.ax0.set_xlim(self.autoplay_xlim_start, self.autoplay_xlim_end) + self.canvas.draw() + + def plot_data_and_label(self, ax_top=True, ax_bottom=True, ax_left=True, ax_right=True): + self.ax0 = self.figure.add_subplot(self.gs[0]) + self.ax0.plot(self.data1, label="data1", color='b') + self.ax0.plot(self.label1, self.points_y_1, 'ro', label='label1') + self.ax0 = plt.gca() + self.ax0.grid(True) + self.ax0.spines["top"].set_visible(ax_top) + self.ax0.spines["right"].set_visible(ax_right) + self.ax0.spines["bottom"].set_visible(ax_bottom) + self.ax0.spines["left"].set_visible(ax_left) + self.ax0.tick_params(axis='x', colors='white') + self.ax0.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f"{x:.0f}")) + + self.ax1 = self.figure.add_subplot(self.gs[1], sharex=self.ax0, sharey=self.ax0) + self.line_data2, = self.ax1.plot(self.data2, label="data2", color='b') + self.point_label2, = self.ax1.plot(self.label2, self.points_y_2, 'ro', label='label2') + self.ax1 = plt.gca() + self.ax1.grid(True) + self.ax1.spines["top"].set_visible(ax_top) + self.ax1.spines["right"].set_visible(ax_right) + self.ax1.spines["bottom"].set_visible(ax_bottom) + self.ax1.spines["left"].set_visible(ax_left) + + self.ax0.autoscale(False) + self.ax0.callbacks.connect('xlim_changed', lambda ax: self.on_xlim_change(ax)) + + def toggle_home(self): + if self.timer_autoplay.isActive() == True: + self.autoplay_mode = "pause" + self.timer_autoplay.stop() + info("Paused Autoplay.") + self.textBrowser_update("操作:暂停自动播放") + self.ax0.autoscale(True) + self.ax0.relim() + self.ax0.autoscale_view() + self.canvas.draw() + self.ax0.autoscale(False) + self.textBrowser_update("操作:尺度恢复") + + def toggle_changeLabel_Single_mode(self, state): + if state: + self.deactivate_figToolbar_buttons() + self.figToolbar.action_Label_Single.setChecked(True) + self.figToolbar.action_Label_Multiple.setChecked(False) + self.figToolbar.cid_mouse_press = self.canvas.mpl_connect('button_press_event', self.on_click) + self.figToolbar.cid_mouse_release = self.canvas.mpl_connect('button_release_event', self.on_release) + else: + if self.figToolbar.cid_mouse_press is not None: + self.canvas.mpl_disconnect(self.figToolbar.cid_mouse_press) + self.figToolbar.cid_mouse_press = None + if self.figToolbar.cid_mouse_release is not None: + self.canvas.mpl_disconnect(self.figToolbar.cid_mouse_release) + self.figToolbar.cid_mouse_release = None + + def toggle_changeLabel_Multiple_mode(self, state): + if state: + self.deactivate_figToolbar_buttons() + self.figToolbar.action_Label_Single.setChecked(False) + self.figToolbar.action_Label_Multiple.setChecked(True) + self.figToolbar.cid_mouse_press = self.canvas.mpl_connect('button_press_event', self.on_click) + self.figToolbar.cid_mouse_release = self.canvas.mpl_connect('button_release_event', self.on_release) + self.figToolbar.cid_mouse_hold = self.canvas.mpl_connect('motion_notify_event', self.on_hold) + else: + if self.figToolbar.cid_mouse_press is not None: + self.canvas.mpl_disconnect(self.figToolbar.cid_mouse_press) + self.figToolbar.cid_mouse_press = None + if self.figToolbar.cid_mouse_release is not None: + self.canvas.mpl_disconnect(self.figToolbar.cid_mouse_release) + self.figToolbar.cid_mouse_release = None + if self.figToolbar.cid_mouse_hold: + self.canvas.mpl_disconnect(self.figToolbar.cid_mouse_hold) + self.figToolbar.cid_mouse_hold = None + + def deactivate_figToolbar_buttons(self): + for action in self.figToolbar._actions.values(): + if action.isChecked() == True: + if action == self.figToolbar._actions['pan']: + self.figToolbar.pan() + if action == self.figToolbar._actions['zoom']: + self.figToolbar.zoom() + + def on_click(self, event): + if self.figToolbar.action_Label_Single.isChecked(): + if event.button == 1: + self.is_left_button_pressed = True + self.add_temp_point(event) + elif event.button == 3: + self.is_right_button_pressed = True + self.remove_temp_point(event) + elif self.figToolbar.action_Label_Multiple.isChecked(): + if event.button == 1 or event.button == 3: # 左键或右键 + if event.button == 1: + self.is_left_button_pressed = True + elif event.button == 3: + self.is_right_button_pressed = True + self.figToolbar.rect_start_x = event.xdata + # 如果矩形patch已存在,先移除 + if self.figToolbar.rect_patch is not None: + self.figToolbar.rect_patch.remove() + self.figToolbar.rect_patch = None + self.canvas.draw() + + def on_release(self, event): + if self.figToolbar.action_Label_Single.isChecked(): + if event.button == 1 and self.is_left_button_pressed: + self.is_left_button_pressed = False + if self.temp_point: + self.label2 = np.append(self.label2, self.temp_point[0]) + self.points_y_2 = np.append(self.points_y_2, self.temp_point[1]) + info(f"Added point: ({str(self.temp_point[0])},{str(self.temp_point[1])}).") + self.textBrowser_update(f"操作:新增点:({str(self.temp_point[0])},{str(self.temp_point[1])})") + self.temp_point = None + self.redraw_plot() + elif event.button == 3 and self.is_right_button_pressed: + self.is_right_button_pressed = False + if self.temp_point: + distances = np.abs(np.array(self.label2) - self.temp_point[0]) + if len(distances) > 0: + idx = distances.argmin() + info(f"Removed point {idx + 1}: ({str(self.label2[idx])},{str(self.points_y_2[idx])}).") + self.textBrowser_update(f"操作:删除第{idx + 1}点:({str(self.label2[idx])},{str(self.points_y_2[idx])})") + self.label2 = np.delete(self.label2, idx) + self.points_y_2 = np.delete(self.points_y_2, idx) + self.temp_point = None + self.redraw_plot() + self.label2.sort() + self.points_y_2 = [self.data2[x] for x in self.label2] + self.update_tableWidget_and_info() + np.savetxt(Path(self.lineEdit_savepath.text()), self.label2, fmt='%d', newline='\n') + elif self.figToolbar.action_Label_Multiple.isChecked(): + if self.figToolbar.rect_start_x is not None: + self.figToolbar.rect_end_x = event.xdata + if self.figToolbar.rect_start_x is not None and self.figToolbar.rect_end_x is not None: + if self.figToolbar.rect_start_x < self.figToolbar.rect_end_x: + rect_left = self.figToolbar.rect_start_x + rect_right = self.figToolbar.rect_end_x + elif self.figToolbar.rect_start_x > self.figToolbar.rect_end_x: + rect_left = self.figToolbar.rect_end_x + rect_right = self.figToolbar.rect_start_x + else: + rect_left = self.figToolbar.rect_start_x + rect_right = self.figToolbar.rect_start_x + else: + rect_left = self.figToolbar.rect_start_x + rect_right = self.figToolbar.rect_start_x + if event.button == 1 and self.is_left_button_pressed: + self.is_left_button_pressed = False + if rect_left < 0: + rect_left = 0 + if rect_right >= len(self.data2): + rect_right = len(self.data2) - 1 + selected_area_for_add_points = self.data2[int(rect_left):int(rect_right)] + peaks_idx, _ = find_peaks(selected_area_for_add_points, height=float(self.lineEdit_findpeaks_min_height.text()), distance=float(self.lineEdit_findpeaks_min_interval.text())) + peaks_idx = peaks_idx + int(rect_left) + if len(peaks_idx) != 0: + info(f"Added {len(peaks_idx)} points.") + self.textBrowser_update(f"操作:新增{len(peaks_idx)}个点") + else: + info(f"No point added in selected area.") + self.textBrowser_update(f"操作:所选区间内无新增点") + self.label2 = np.append(self.label2, peaks_idx) + self.points_y_2 = np.append(self.points_y_2, self.data2[peaks_idx]) + self.redraw_plot() + elif event.button == 3 and self.is_right_button_pressed: + self.is_right_button_pressed = False + left_label2_to_delete = self.label2 - rect_left + right_label2_to_delete = self.label2 - rect_right + self.left_label2_to_delete_idx = len(left_label2_to_delete[left_label2_to_delete < 0]) + self.right_label2_to_delete_idx = len(right_label2_to_delete[right_label2_to_delete < 0]) + if self.left_label2_to_delete_idx != self.right_label2_to_delete_idx: + info(f"Removed points from {self.left_label2_to_delete_idx + 1} to {self.right_label2_to_delete_idx}.") + self.textBrowser_update(f"操作:删除第{self.left_label2_to_delete_idx + 1}到{self.right_label2_to_delete_idx}点") + else: + info(f"No point to delete in selected area.") + self.textBrowser_update(f"操作:所选区间内无删除点") + self.label2 = np.delete(self.label2, np.arange(self.left_label2_to_delete_idx, self.right_label2_to_delete_idx)) + self.points_y_2 = np.delete(self.points_y_2, np.arange(self.left_label2_to_delete_idx, self.right_label2_to_delete_idx)) + self.redraw_plot() + self.figToolbar.rect_start_x = None + self.figToolbar.rect_end_x = None + self.label2.sort() + self.points_y_2 = [self.data2[x] for x in self.label2] + self.update_tableWidget_and_info() + np.savetxt(Path(self.lineEdit_savepath.text()), self.label2, fmt='%d', newline='\n') + # 移除矩形patch + if self.figToolbar.rect_patch is not None: + self.figToolbar.rect_patch.remove() + self.figToolbar.rect_patch = None + self.canvas.draw() + + def on_hold(self, event): + if self.figToolbar.rect_start_x is not None and event.xdata is not None: + self.figToolbar.rect_end_x = event.xdata + + # 如果矩形patch不存在,则创建一个新的 + if self.figToolbar.rect_patch is None: + if self.is_left_button_pressed: + self.figToolbar.rect_patch = plt.Rectangle((0, 0), 1, 1, fill=True, alpha=0.2, color='#ff00ff') + elif self.is_right_button_pressed: + self.figToolbar.rect_patch = plt.Rectangle((0, 0), 1, 1, fill=True, alpha=0.2, color='r') + self.ax1.add_patch(self.figToolbar.rect_patch) + + # 更新矩形patch的位置和大小 + x_start = self.figToolbar.rect_start_x + x_end = self.figToolbar.rect_end_x + y_min, y_max = self.ax1.get_ylim() + self.figToolbar.rect_patch.set_xy((min(x_start, x_end), y_min)) + self.figToolbar.rect_patch.set_width(abs(x_end - x_start)) + self.figToolbar.rect_patch.set_height(y_max - y_min) + + self.canvas.draw() + + def on_motion(self, event): + if event.inaxes: + # Clear previous reference lines and temporary points + for line in self.ax0.lines[1:]: + if line.get_label() == 'vline' or line.get_label() == 'hline' or line.get_label() == 'temp_point': + line.remove() + for line in self.ax1.lines[1:]: + if line.get_label() == 'vline' or line.get_label() == 'hline' or line.get_label() == 'temp_point': + line.remove() + + # Draw vertical and horizontal reference lines + self.ax0.axvline(event.xdata, color='gray', linestyle='--', label='vline') + self.ax0.axhline(event.ydata, color='gray', linestyle='--', label='hline') + self.ax1.axvline(event.xdata, color='gray', linestyle='--', label='vline') + self.ax1.axhline(event.ydata, color='gray', linestyle='--', label='hline') + + # Draw temporary point if left button is pressed + if self.is_left_button_pressed: + self.add_temp_point(event) + elif self.is_right_button_pressed: + self.remove_temp_point(event) + + self.canvas.draw() + + def add_temp_point(self, event): + if self.figToolbar.action_Label_Single.isChecked(): + # Find the closest x value on the curve + idx = np.abs(np.arange(len(self.data2)) - event.xdata).argmin() + x_point = np.arange(len(self.data2))[idx] + y_point = self.data2[idx] + + # Store the temporary point + self.temp_point = (x_point, y_point) + + # Plot the temporary point + self.ax1.plot(x_point, y_point, marker='o', color='#ff00ff', label='temp_point') + self.ax1.plot(x_point, y_point, marker='x', color='#ff00ff', markersize=30, label='temp_point') + + def remove_temp_point(self, event): + if self.figToolbar.action_Label_Single.isChecked(): + if self.label2.any(): + # Find the closest point to the current x coordinate + distances = np.abs(np.array(self.label2) - event.xdata) + idx = distances.argmin() + x_point = self.label2[idx] + y_point = self.points_y_2[idx] + + # Store the temporary point to be removed + self.temp_point = (x_point, y_point) + + # Plot the temporary point to be removed + self.ax1.plot(x_point, y_point, marker='x', color='r', markersize=30, label='temp_point') + + def redraw_plot(self): + self.point_label2.remove() + self.point_label2, = self.ax1.plot(self.label2, self.points_y_2, 'ro', label='label2') + self.canvas.draw() + + def on_xlim_change(self, event_ax): + try: + if self.annotation_tableWidget: + self.annotation_tableWidget.remove() + except AttributeError: + pass + self.annotation_tableWidget = None + self.canvas.draw() + +class CustomNavigationToolbar(NavigationToolbar2QT): + def __init__(self, canvas, parent): + super().__init__(canvas, parent) + # 初始化画框工具栏 + self.action_Label_Single = QAction('逐一更改标签(Z)', self) + self.action_Label_Single.setFont(QFont("黑体", 14)) + self.action_Label_Single.setCheckable(True) + self.action_Label_Single.setShortcut(QCoreApplication.translate("MainWindow", "Z")) + self.action_Label_Multiple = QAction('批量更改标签(X)', self) + self.action_Label_Multiple.setFont(QFont("黑体", 14)) + self.action_Label_Multiple.setCheckable(True) + self.action_Label_Multiple.setShortcut(QCoreApplication.translate("MainWindow", "X")) + self.insertAction(self._actions['pan'], self.action_Label_Single) + self.insertAction(self._actions['pan'], self.action_Label_Multiple) + + self._actions['pan'].setShortcut(QCoreApplication.translate("MainWindow", "C")) + + # 用于存储事件连接ID + self.cid_mouse_press = None + self.cid_mouse_release = None + self.cid_mouse_hold = None + + # 初始化矩形选择区域 + self.rect_start_x = None + self.rect_end_x = None + self.rect_patch = None # 用于绘制矩形的patch + + def home(self, *args): + pass + + def zoom(self, *args): + super().zoom(*args) + self.deactivate_figToorbar_changeLabel_mode() + + def pan(self, *args): + super().pan(*args) + self.deactivate_figToorbar_changeLabel_mode() + + def deactivate_figToorbar_changeLabel_mode(self): + if self.action_Label_Single.isChecked(): + self.action_Label_Single.setChecked(False) + if self.cid_mouse_press is not None: + self.canvas.mpl_disconnect(self.cid_mouse_press) + self.cid_mouse_press = None + if self.cid_mouse_release is not None: + self.canvas.mpl_disconnect(self.cid_mouse_release) + self.cid_mouse_release = None + elif self.action_Label_Multiple.isChecked(): + self.action_Label_Multiple.setChecked(False) + if self.cid_mouse_press is not None: + self.canvas.mpl_disconnect(self.cid_mouse_press) + self.cid_mouse_press = None + if self.cid_mouse_release is not None: + self.canvas.mpl_disconnect(self.cid_mouse_release) + self.cid_mouse_release = None + if self.cid_mouse_hold is not None: + self.canvas.mpl_disconnect(self.cid_mouse_hold) + self.cid_mouse_hold = None + +# 主函数 +if __name__ == '__main__': + app = QApplication(sys.argv) + mainWindow = MainWindow() + mainWindow.show() + sys.exit(app.exec_()) \ No newline at end of file