From 387618efb91e09149b3a955e8224059cb0eb87ef Mon Sep 17 00:00:00 2001 From: gitea Date: Thu, 10 Apr 2025 11:33:42 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=88=A0=E9=99=A4=E6=9C=AA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E9=83=A8=E5=88=86=202.=20=E5=88=A0=E9=99=A4=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0sqlite=E4=BF=9D=E5=AD=98=E5=8A=9F=E8=83=BD=203.=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9Edo=5Fcurrent=E5=A4=9A=E9=87=87=E9=9B=86?= =?UTF-8?q?=E4=B8=A4=E6=9D=A1=E6=9B=B2=E7=BA=BF=204.=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=80=90=E4=B9=85=E9=87=87=E9=9B=86=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=9C=80=E7=9F=AD=E9=97=B4=E9=9A=94=E6=9C=AA30s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- aio.py | 20 -- assets/files/version/file_version_info.txt | 8 +- assets/files/version/local_vers | 2 +- assets/files/version/server_vers | 2 +- codes/autotest/do_current.py | 23 ++- codes/common/clibs.py | 3 +- codes/durable/curves_draw.py | 226 +++++++++++++++++++++ codes/ui/main_window.py | 6 +- ui/main.ui | 4 +- 10 files changed, 258 insertions(+), 40 deletions(-) create mode 100644 codes/durable/curves_draw.py diff --git a/.gitignore b/.gitignore index b0393ad..b2845a1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ venv/ **/__pycache__/ assets/files/examples/ assets/logs/* -codes/durable/curves_draw.py -package/* \ No newline at end of file +package/* +test/ \ No newline at end of file diff --git a/aio.py b/aio.py index 171f630..b6dc946 100644 --- a/aio.py +++ b/aio.py @@ -1,16 +1,9 @@ import datetime import json -import os import re -import sqlite3 import sys import time from urllib import request -import os.path -# import matplotlib -# import matplotlib.pyplot as plt -# import pandas -# from matplotlib.widgets import Slider from PySide6.QtCore import Qt, QThread, Signal, QObject, QTimer from PySide6.QtGui import QTextCursor, QFont, QPixmap, QColor, QBrush, QIcon @@ -22,7 +15,6 @@ import codes.ui.main_window as main_window from codes.analysis import brake, current, wavelogger, iso from codes.autotest import do_current, do_brake from codes.durable import factory_test, curves_draw -# matplotlib.use('QtAgg') class ContentDialog(QDialog): @@ -895,18 +887,6 @@ class MainWindow(main_window.Ui_MainWindow): info_text = "当前有程序正在停止中,确认退出?" if clibs.stop_flag else info_text reply = QMessageBox.question(self, "退出", info_text) if reply == QMessageBox.Yes: - # os.chdir(clibs.log_path) - # t = datetime.datetime.now().strftime("%Y%m%d%H%M%S") - # disk_conn = sqlite3.connect(f"log_{t}.db", isolation_level=None, check_same_thread=False, cached_statements=256) - # - # clibs.conn.backup(target=disk_conn, pages=1, progress=None) - # - # _, logs = clibs.traversal_files(".") - # logs.sort() - # while len(logs) > 10: - # _ = logs.pop(0) - # os.remove(_) - if clibs.status["md"] == 1: self.run_program_thread(clibs.c_md.close, -99, self.prog_done_disconn, "md") if clibs.status["ec"] == 1: diff --git a/assets/files/version/file_version_info.txt b/assets/files/version/file_version_info.txt index 99f4620..40268e1 100644 --- a/assets/files/version/file_version_info.txt +++ b/assets/files/version/file_version_info.txt @@ -6,8 +6,8 @@ VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. - filevers=(0, 4, 0, 2), - prodvers=(0, 4, 0, 2), + filevers=(0, 4, 0, 3), + prodvers=(0, 4, 0, 3), # Contains a bitmask that specifies the valid bits 'flags'r mask=0x3f, # Contains a bitmask that specifies the Boolean attributes of the file. @@ -31,12 +31,12 @@ VSVersionInfo( '040904b0', [StringStruct('CompanyName', 'Rokae - https://www.rokae.com/'), StringStruct('FileDescription', 'All in one automatic toolbox'), - StringStruct('FileVersion', '0.4.0.2 (2025-04-07)'), + StringStruct('FileVersion', '0.4.0.3 (2025-04-10)'), StringStruct('InternalName', 'AIO.exe'), StringStruct('LegalCopyright', '© 2024-2025 Manford Fan'), StringStruct('OriginalFilename', 'AIO.exe'), StringStruct('ProductName', 'AIO'), - StringStruct('ProductVersion', '0.4.0.2 (2025-04-07)')]) + StringStruct('ProductVersion', '0.4.0.3 (2025-04-10)')]) ]), VarFileInfo([VarStruct('Translation', [1033, 1200])]) ] diff --git a/assets/files/version/local_vers b/assets/files/version/local_vers index 33c76ce..10cb691 100644 --- a/assets/files/version/local_vers +++ b/assets/files/version/local_vers @@ -1 +1 @@ -0.4.0.2@04/07/2025 \ No newline at end of file +0.4.0.3@04/10/2025 \ No newline at end of file diff --git a/assets/files/version/server_vers b/assets/files/version/server_vers index 33c76ce..10cb691 100644 --- a/assets/files/version/server_vers +++ b/assets/files/version/server_vers @@ -1 +1 @@ -0.4.0.2@04/07/2025 \ No newline at end of file +0.4.0.3@04/10/2025 \ No newline at end of file diff --git a/codes/autotest/do_current.py b/codes/autotest/do_current.py index 8efbcad..a9c9ea2 100644 --- a/codes/autotest/do_current.py +++ b/codes/autotest/do_current.py @@ -67,7 +67,7 @@ class DoCurrentTest(QThread): def single_axis_proc(self, records, number): text = "single" if number < 6 else "hold" number = number if number < 6 else number - 6 - d_vel, d_trq, d_sensor, d_trans = [], [], [], [] + d_vel, d_trq, d_sensor, d_trans, d_predict_trq, d_real_trq = [], [], [], [], [], [] for record in records: data = eval(record[0])["data"] for item in data: @@ -80,17 +80,24 @@ class DoCurrentTest(QThread): d_sensor.extend(d_item) elif item.get("channel", None) == number and item.get("name", None) == "hw_estimate_trans_trq_res": d_trans.extend(d_item) + elif item.get("channel", None) == number and item.get("name", None) == "hw_predict_trq_res": + d_predict_trq.extend(d_item) + elif item.get("channel", None) == number and item.get("name", None) == "hw_real_trq_res": + d_real_trq.extend(d_item) df1 = pandas.DataFrame.from_dict({"hw_joint_vel_feedback": d_vel}) df2 = pandas.DataFrame.from_dict({"device_servo_trq_feedback": d_trq}) df3 = pandas.DataFrame.from_dict({"hw_sensor_trq_feedback": d_sensor}) df4 = pandas.DataFrame.from_dict({"hw_estimate_trans_trq_res": d_trans}) - df = pandas.concat([df1, df2, df3, df4], axis=1) + df5 = pandas.DataFrame.from_dict({"hw_predict_trq_res": d_predict_trq}) + df6 = pandas.DataFrame.from_dict({"hw_real_trq_res": d_real_trq}) + df = pandas.concat([df1, df2, df3, df4, df5, df6], axis=1) filename = f"{self.dir_path}/single/j{number + 1}_{text}_{time.time()}.data" df.to_csv(filename, sep="\t", index=False) def scenario_proc(self, records, number, scenario_time): - d_vel, d_trq, d_sensor, d_trans = [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []] + # d_vel, d_trq, d_sensor, d_trans, d_predict_trq, d_real_trq = [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []], [[], [], [], [], [], []] + d_vel, d_trq, d_sensor, d_trans, d_predict_trq, d_real_trq = [[[], [], [], [], [], []] for _ in range(6)] for record in records: data = eval(record[0])["data"] for item in data: @@ -104,13 +111,19 @@ class DoCurrentTest(QThread): d_sensor[axis].extend(d_item) elif item.get("channel", None) == axis and item.get("name", None) == "hw_estimate_trans_trq_res": d_trans[axis].extend(d_item) + elif item.get("channel", None) == number and item.get("name", None) == "hw_predict_trq_res": + d_predict_trq[axis].extend(d_item) + elif item.get("channel", None) == number and item.get("name", None) == "hw_real_trq_res": + d_real_trq[axis].extend(d_item) for axis in range(6): df1 = pandas.DataFrame.from_dict({"hw_joint_vel_feedback": d_vel[axis]}) df2 = pandas.DataFrame.from_dict({"device_servo_trq_feedback": d_trq[axis]}) df3 = pandas.DataFrame.from_dict({"hw_sensor_trq_feedback": d_sensor[axis]}) df4 = pandas.DataFrame.from_dict({"hw_estimate_trans_trq_res": d_trans[axis]}) - df = pandas.concat([df1, df2, df3, df4], axis=1) + df5 = pandas.DataFrame.from_dict({"hw_predict_trq_res": d_predict_trq[axis]}) + df6 = pandas.DataFrame.from_dict({"hw_real_trq_res": d_real_trq[axis]}) + df = pandas.concat([df1, df2, df3, df4, df5, df6], axis=1) filename = f"{self.dir_path}/s_{number-11}/j{axis+1}_s_{number-11}_{scenario_time}_{time.time()}.data" df.to_csv(filename, sep="\t", index=False) @@ -139,7 +152,7 @@ class DoCurrentTest(QThread): @staticmethod def change_curve_state(stat): - curves = ["hw_joint_vel_feedback", "device_servo_trq_feedback", "hw_sensor_trq_feedback", "hw_estimate_trans_trq_res"] + curves = ["hw_joint_vel_feedback", "device_servo_trq_feedback", "hw_sensor_trq_feedback", "hw_estimate_trans_trq_res", "hw_predict_trq_res", "hw_real_trq_res"] display_pdo_params = [] if not stat else [{"name": curve, "channel": chl} for curve in curves for chl in range(6)] clibs.c_hr.execution("diagnosis.open", open=stat, display_open=stat) clibs.c_hr.execution("diagnosis.set_params", display_pdo_params=display_pdo_params) diff --git a/codes/common/clibs.py b/codes/common/clibs.py index 8bc32c4..743b6e8 100644 --- a/codes/common/clibs.py +++ b/codes/common/clibs.py @@ -104,14 +104,13 @@ def detect_db_size(): PREFIX = "resources/assets" # for pyinstaller # PREFIX = "assets" # for local testing -# log_path = f"{PREFIX}/logs" lock = threading.Lock() running = [0, 0, 0, 0, 0, 0, 0] # 制动数据/转矩数据/激光数据/精度数据/制动自动化/转矩自动化/耐久数据采集 stop_flag = False functions = ["制动数据处理", "转矩数据处理", "激光数据处理", "精度数据处理", "制动自动化测试", "转矩自动化测试", "耐久数据采集"] levels = ["DEBUG", "INFO", "WARNING", "ERROR"] ip_addr, ssh_port, socket_port, xService_port, external_port, modbus_port, upgrade_port = "", 22, 5050, 6666, 8080, 502, 4567 -username, password = "luoshi", "123456" +username, password = "luoshi", "luoshi2019" INTERVAL, RADIAN, MAX_FRAME_SIZE, MAX_LOG_NUMBER, CYCLE = 1, 57.3, 1024, 10, 30 c_md, c_hr, c_ec, c_pd, conn, cursor, search_records, logger, count = None, None, None, None, None, None, None, None, 0 status = {"mysql": 0, "hmi": 0, "md": 0, "ec": 0} diff --git a/codes/durable/curves_draw.py b/codes/durable/curves_draw.py new file mode 100644 index 0000000..6abab9f --- /dev/null +++ b/codes/durable/curves_draw.py @@ -0,0 +1,226 @@ +from PySide6.QtWidgets import QApplication, QMainWindow, QSlider, QVBoxLayout, QComboBox, QWidget, QPushButton, QToolBar, QGridLayout, QHBoxLayout, QLabel, QRadioButton, QScrollArea, QSizePolicy, QSpacerItem +from PySide6.QtCore import Qt, QTimer, QSize, QPointF +from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis +from PySide6.QtGui import QAction, QPainter, QColor, QIcon, QFont +from codes.common import clibs +import os +import pandas + + +class ChartWindow(QMainWindow): + curve_map = { + "周期内平均转矩": ["device_servo_trq_feedback", ], + "周期内最大速度": ["hw_joint_vel_feedback", ], + } + ylabels = {"周期内最大速度": "速度(rad/s)", "周期内平均转矩": "转矩(Nm)"} + colors = [QColor(255, 0, 0), QColor(255, 0, 0), QColor(0, 0, 255), QColor(0, 255, 0), QColor(254, 153, 0), QColor(0, 255, 255), QColor(255, 0, 255), QColor(0, 0, 0), QColor(255, 255, 255), QColor(128, 128, 128), QColor(255, 182, 193), QColor(173, 216, 230), QColor(144, 238, 144)] + + def __init__(self, dir_path, procs): + super().__init__() + self.procs = procs + self.dir_path = dir_path + self.setup_ui() + self.detect_files() + + # self.timer = QTimer() + # self.timer.timeout.connect(self.reset_zoom) + # self.timer.start(60000) # 60000ms 更新一次数据 + + def detect_files(self): + with open(f"{clibs.PREFIX}/qss/style.qss", mode="r", encoding="utf-8") as f_qss: + style_sheet = f_qss.read() + self.setStyleSheet(style_sheet) + + if not os.path.exists(self.dir_path): + clibs.logger("ERROR", "curves_draw", f"数据文件夹{self.dir_path}不存在,请确认后重试......", "red") + for proc_name, is_enabled in self.procs.items(): + if is_enabled: + break + else: + clibs.logger("ERROR", "curves_draw", f"需要选择至少一个功能,才能继续绘图......", "red") + + _, files = clibs.traversal_files(self.dir_path) + csv_files = [] + for file in files: + if file.lower().endswith(".csv"): + self.cb_func_name.addItem(file.split("/")[-1].split(".")[0]) + csv_files.append(file) + + if len(csv_files) == 0: + clibs.logger("ERROR", "curves_draw", "程序未开始运行,暂无数据可以展示......", "red") + + self.reset_zoom() + + def get_current_info(self): + self.func_name = self.cb_func_name.currentText() + self.file_name = f"{self.dir_path}/{self.func_name}.csv" + self.df = pandas.read_csv(self.file_name) + self.horizontal_slider.setRange(0, len(self.df)) + + def center_on_screen(self): + screen_geometry = QApplication.primaryScreen().geometry() + screen_width = screen_geometry.width() + screen_height = screen_geometry.height() + + win_width = self.width() + win_height = self.height() + x = (screen_width - win_width) // 2 + y = (screen_height - win_height) // 2 + self.move(x, y) + + def setup_ui(self): + self.setWindowTitle("曲线绘制") + self.setGeometry(100, 100, 1000, 500) + self.setWindowIcon(QIcon(f"{clibs.PREFIX}/media/icon.ico")) + self.center_on_screen() + + # 窗体布局 + self.centralwidget = QWidget(self) + self.centralwidget.setObjectName(u"centralwidget") + self.gridLayout = QGridLayout(self.centralwidget) + self.gridLayout.setObjectName(u"gridLayout") + + # 布局spinbox 和 label coordinate + self.hl_spinbox_btn = QHBoxLayout() + self.hl_spinbox_btn.setObjectName(u"hl_spinbox_btn") + font = QFont() + font.setFamilies([u"Consolas"]) + font.setPointSize(10) + self.rb_x = QRadioButton(self.centralwidget) + self.rb_x.setObjectName(u"rb_x") + self.rb_x.setText(u"仅X轴缩放") + self.rb_x.setFont(font) + self.rb_y = QRadioButton(self.centralwidget) + self.rb_y.setObjectName(u"rb_y") + self.rb_y.setText(u"仅Y轴缩放") + self.rb_y.setFont(font) + self.rb_xy = QRadioButton(self.centralwidget) + self.rb_xy.setObjectName(u"rb_xy") + self.rb_xy.setText(u"XY轴缩放") + self.rb_xy.setFont(font) + self.rb_xy.setChecked(True) + + self.cb_func_name = QComboBox(self.centralwidget) + self.cb_func_name.setObjectName(u"cb_func_name") + self.cb_func_name.setMinimumSize(QSize(200, 0)) + self.cb_func_name.setFont(font) + self.button_reset = QPushButton(self.centralwidget) + self.button_reset.setObjectName(u"button_reset") + self.button_reset.setFont(font) + self.button_reset.setText(u"视图重置") + self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.hl_spinbox_btn.addWidget(self.rb_x) + self.hl_spinbox_btn.addWidget(self.rb_y) + self.hl_spinbox_btn.addWidget(self.rb_xy) + self.hl_spinbox_btn.addItem(self.horizontalSpacer) + self.hl_spinbox_btn.addWidget(self.cb_func_name) + self.hl_spinbox_btn.addWidget(self.button_reset) + # 连接信号 + self.rb_x.clicked.connect(lambda: self.set_zoom_mode(QChartView.RubberBand.HorizontalRubberBand)) + self.rb_y.clicked.connect(lambda: self.set_zoom_mode(QChartView.RubberBand.VerticalRubberBand)) + self.rb_xy.clicked.connect(lambda: self.set_zoom_mode(QChartView.RubberBand.RectangleRubberBand)) + self.button_reset.clicked.connect(self.reset_zoom) + self.cb_func_name.currentTextChanged.connect(self.cb_func_name_change) + + # 生成曲线图 + self.chart = QChart() + self.chart.setTheme(QChart.ChartTheme.ChartThemeLight) # 设置主题 + self.chart.legend().setVisible(True) + self.chart.legend().setAlignment(Qt.AlignmentFlag.AlignRight) # 图例右对齐 + self.chart_view = QChartView(self.chart) + self.chart_view.setRubberBand(QChartView.RubberBand.RectangleRubberBand) # 矩形缩放 + self.chart_view.setRenderHint(QPainter.RenderHint.Antialiasing) # 抗锯齿 + self.axisX = QValueAxis() + # self.axisX.setTitleText("X轴") + self.axisX.setRange(0, 10) # 初始显示范围 + self.axisY = QValueAxis() + # self.axisY.setTitleText("Y轴") + self.axisY.setRange(-5, 5) + self.chart.addAxis(self.axisX, Qt.AlignmentFlag.AlignBottom) + self.chart.addAxis(self.axisY, Qt.AlignmentFlag.AlignLeft) + # 创建水平滚动条 + self.horizontal_slider = QSlider(Qt.Orientation.Horizontal) + self.horizontal_slider.valueChanged.connect(self.update_view) + # self.horizontal_slider.setFixedHeight(200) + + # 左侧布局 + self.vl_central = QVBoxLayout() + self.vl_central.setObjectName(u"vl_central") + self.vl_central.addWidget(self.chart_view) + self.vl_central.addWidget(self.horizontal_slider) + self.vl_central.addLayout(self.hl_spinbox_btn) + self.vl_central.setStretch(0, 20) + self.vl_central.setStretch(1, 1) + self.vl_central.setStretch(2, 1) + + self.gridLayout.addLayout(self.vl_central, 0, 0) + self.setCentralWidget(self.centralwidget) + + def connect_legend_markers(self): + for marker in self.chart.legend().markers(): + try: + marker.clicked.disconnect() + except: + pass + marker.clicked.connect(self.toggle_series_visibility) + self.update_legend_style(marker) + + def update_legend_style(self, marker): + alpha = 255 if marker.series().isVisible() else 128 + color = marker.labelBrush().color() + color.setAlpha(alpha) + marker.setLabelBrush(color) + + marker_color = marker.series().color() + marker_color.setAlpha(alpha) + marker.setBrush(marker_color) + marker.setPen(marker_color.darker()) + + def toggle_series_visibility(self): + marker = self.sender() + if series := marker.series(): + new_visibility = not series.isVisible() + series.setVisible(new_visibility) + self.update_legend_style(marker) + marker.setVisible(True) + + def cb_func_name_change(self): + self.reset_zoom() + + def set_zoom_mode(self, mode): + """设置缩放模式""" + self.chart_view.setRubberBand(mode) + # 取消其他按钮的选中状态 + self.rb_x.setChecked(mode == QChartView.RubberBand.HorizontalRubberBand) + self.rb_y.setChecked(mode == QChartView.RubberBand.VerticalRubberBand) + self.rb_xy.setChecked(mode == QChartView.RubberBand.RectangleRubberBand) + + def reset_zoom(self): + self.chart.removeAllSeries() + self.get_current_info() + self.axisY.setTitleText(self.ylabels[self.func_name]) + + series_s = [QLineSeries() for _ in range(18)] + for col in range(1, len(self.df.columns)): + self.series = series_s[col] + self.chart.addSeries(self.series) + self.series.attachAxis(self.axisX) + self.series.attachAxis(self.axisY) + data = [QPointF(idx, self.df.iloc[:, col].values[idx]) for idx in range(len(self.df))] + self.series.append(data) + self.series.setColor(self.colors[col]) + self.series.setName(self.df.columns[col]) + + self.chart.zoomReset() # 重置所有缩放 + self.horizontal_slider.setValue(0) + self.axisX.setRange(0, len(self.df)) + self.axisY.setRange(min(self.df.iloc[:, 1:].min())-1, max(self.df.iloc[:, 1:].max())+1) + self.connect_legend_markers() + + def update_view(self): + self.connect_legend_markers() + # 自动滚动显示最新10个点 + if self.horizontal_slider.value() > 10: + self.axisX.setRange(self.horizontal_slider.value() - 10, self.horizontal_slider.value()) + else: + self.axisX.setRange(0, 10) diff --git a/codes/ui/main_window.py b/codes/ui/main_window.py index 13ac54b..563b8d7 100644 --- a/codes/ui/main_window.py +++ b/codes/ui/main_window.py @@ -27,7 +27,7 @@ class Ui_MainWindow(QMainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") MainWindow.setEnabled(True) - MainWindow.resize(1006, 568) + MainWindow.resize(1004, 563) sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -281,7 +281,7 @@ class Ui_MainWindow(QMainWindow): self.sa_durable.setWidgetResizable(True) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 213, 78)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 212, 78)) self.horizontalLayout_9 = QHBoxLayout(self.scrollAreaWidgetContents) self.horizontalLayout_9.setObjectName(u"horizontalLayout_9") self.verticalLayout_5 = QVBoxLayout() @@ -950,7 +950,7 @@ class Ui_MainWindow(QMainWindow): #if QT_CONFIG(whatsthis) self.le_durable_interval.setWhatsThis("") #endif // QT_CONFIG(whatsthis) - self.le_durable_interval.setPlaceholderText(QCoreApplication.translate("MainWindow", u"\u6bcf\u6b21\u6570\u636e\u91c7\u96c6\u7684\u65f6\u95f4\u95f4\u9694\uff0c\u9ed8\u8ba4(\u6700\u5c0f)300s", None)) + self.le_durable_interval.setPlaceholderText(QCoreApplication.translate("MainWindow", u"\u6bcf\u6b21\u6570\u636e\u91c7\u96c6\u7684\u65f6\u95f4\u95f4\u9694\uff0c\u9ed8\u8ba4(\u6700\u5c0f)30s", None)) self.cb_durable_total.setText(QCoreApplication.translate("MainWindow", u"\u5168\u90e8\u6253\u5f00/\u5173\u95ed", None)) self.btn_draw.setText(QCoreApplication.translate("MainWindow", u"\u7ed8\u56fe", None)) self.label_3.setText("") diff --git a/ui/main.ui b/ui/main.ui index 9d503fb..936e002 100644 --- a/ui/main.ui +++ b/ui/main.ui @@ -225,7 +225,7 @@ - 1 + 0 Qt::TextElideMode::ElideNone @@ -702,7 +702,7 @@ Qt::InputMethodHint::ImhNone - 每次数据采集的时间间隔,默认(最小)300s + 每次数据采集的时间间隔,默认(最小)30s