diff --git a/PyUartAssistant/BigData_Plot.py b/PyUartAssistant/BigData_Plot.py new file mode 100644 index 0000000..b1de36c --- /dev/null +++ b/PyUartAssistant/BigData_Plot.py @@ -0,0 +1,56 @@ +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGridLayout, QApplication,QMainWindow +from matplotlib.figure import Figure +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas +from matplotlib.backends.backend_qt5 import NavigationToolbar2QT +from PyQt5.QtCore import Qt + +class MyFigureCanvas(FigureCanvas): + def __init__(self, parent=None): + self.figure = Figure() + super(MyFigureCanvas, self).__init__(self.figure) + self.setParent(parent) + +class ChartDialog(QDialog): + def __init__(self, data=None, title="Line Chart", xlabel="X", ylabel="Y", parent=None): + super(ChartDialog, self).__init__(parent) + self.setWindowFlags(Qt.Window) + self.data = data if data is not None else (range(2, 26, 2), [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]) + self.title = title + self.xlabel = xlabel + self.ylabel = ylabel + self.initUI() + + def initUI(self): + self.setWindowTitle(self.title) # 确保标题被设置 + layout = QGridLayout() + self.figureCanvas = MyFigureCanvas(self) + self.draw_figure() + self.navigationToolbar = NavigationToolbar2QT(self.figureCanvas, self) + layout.addWidget(self.navigationToolbar, 0, 0, 1, 1) + layout.addWidget(self.figureCanvas, 1, 0, 1, 1) + self.setLayout(layout) + #self.setGeometry(300, 300, 600, 400) + + def draw_figure(self): + + self.figureCanvas.figure.clear() # 清除整个 Figure + self.axes = self.figureCanvas.figure.add_subplot(111) # 添加新的 Axes + self.axes.set_title(self.title) + self.axes.set_xlabel(self.xlabel) + self.axes.set_ylabel(self.ylabel) + x, y = self.data + self.axes.plot(x, y, color='red') + self.figureCanvas.figure.canvas.draw_idle() # 更新画布上的绘图 + + def tans_data(self,data): + self.data = data + + +def main(): + app = QApplication([]) + dialog = ChartDialog() + dialog.show() + app.exec_() + +if __name__ == "__main__": + main() diff --git a/PyUartAssistant/PyUart.exe b/PyUartAssistant/PyUart.exe index dc786f9..3bc4796 100644 Binary files a/PyUartAssistant/PyUart.exe and b/PyUartAssistant/PyUart.exe differ diff --git a/PyUartAssistant/PyUart.py b/PyUartAssistant/PyUart.py index b15eef3..35eb8dc 100644 --- a/PyUartAssistant/PyUart.py +++ b/PyUartAssistant/PyUart.py @@ -18,6 +18,7 @@ from PyUartUi import Ui_UartAssistant from UartDataPolt import QChartViewPlot,UpdateDataThread,GetDataQX,GetDataTF,GetDataOther from PyQt5.QtChart import QChartView from PyQt5.QtGui import QIcon +from BigData_Plot import ChartDialog class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): @@ -33,7 +34,9 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.get_data_other = GetDataOther() self.get_data_other.IndOfReturn(0) #根据数据特点给一个初始值 + self.chart_dialog = ChartDialog() + self.init() self.ser = serial.Serial() #创建一个空对象 self.port_check() @@ -90,6 +93,10 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.lineUtf8 = "" # 用于标志是否开始存CSV self.CsvFlag = 0 + #用于暂存大数据 + self.bigdata=[] + #开启大数据模式标志位 + self.flag_bigdata =0 # ============================================================================= # def wheelEvent(self, event): # if self.plot_view.underMouse: @@ -151,7 +158,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.checkBoxReapitSend.stateChanged.connect(self.data_send_timer) # 发送数据按钮 - self.pushButtonSend.clicked.connect(self.data_send) + self.pushButtonSend.clicked.connect(lambda: self.data_send(text_quick=None)) #此处处理默认 传递text_quick=false # 保存日志 self.pushButtonLogSave.clicked.connect(self.savefiles) @@ -180,7 +187,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): # 快捷指令扩展区域 self.pushButton_expend.clicked.connect(self.adjust_sidebar) # 创建一个通用的槽函数来处理所有按钮 -# 例如,使用lambda表达式传递额外的参数 + # 例如,使用lambda表达式传递额外的参数 for i in range(1, 21): # 假设有20个按钮 # getattr(self, f'pushButtonQuick_{i}').clicked.connect( # lambda checked, line_edit=f'lineEditQuick_{i}': self.onPushButtonQuickClicked(line_edit) @@ -194,6 +201,8 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): button_id = f'pushButtonQuick_{i}' button.setContextMenuPolicy(Qt.CustomContextMenu) button.customContextMenuRequested.connect(lambda position, button_id=button_id: self.onButtonRightClicked(button_id)) + #大数据模式 + self.pushButton_bigdata.clicked.connect(self.bigdata_show) # %% 串口检测 def port_check(self): @@ -336,6 +345,8 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): # 自动保存日志 if self.checkBoxAutoSaveLog.isChecked(): self.AutoSaveLog() + if self.flag_bigdata == 1: + self.BigDataPlot() @@ -380,9 +391,9 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): QMessageBox.critical(self, '定时发送数据异常', '请设置正确的数值类型!') # %%发送数据 - def data_send(self,text_quick = None): + def data_send(self,text_quick=None): if self.ser.isOpen(): - if text_quick== None: + if text_quick is None: input_s = self.textEditSend.toPlainText() else: input_s = text_quick @@ -486,7 +497,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): # 写入当前日期的文件,打开文件,如果文件不存在则创建,如果存在则追加内容 with open(self.filename, 'a', encoding='utf-8',newline='') as file: - #print (data.decode('utf-8')) + self.lineUtf8 = line.decode('utf-8') saveData = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " " + self.lineUtf8 + "\r\n" @@ -537,7 +548,8 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.lineEditWindowMean.setText (str(round(self.plot_qchart.windowAverage,3))) self.lineEditWindowMSE.setText (str(round(self.plot_qchart.windowStd,3))) else: - print("dataSplit type:",type(dataSplit)) + #print("dataSplit type:",type(dataSplit)) + return None elif self.radioButtonOtherData.isChecked() : print(self.lineUtf8) @@ -561,14 +573,40 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.lineEditWindowMean.setText (str(round(self.plot_qchart.windowAverage,3))) self.lineEditWindowMSE.setText (str(round(self.plot_qchart.windowStd,3))) else: - print("dataSplit type:",type(dataSplit)) + #print("dataSplit type:",type(dataSplit)) + return None except Exception as e: print(f"Error reading configuration: {e}") print("自动保存日志失败") pass - + def BigDataPlot(self): + + try: + lines = self.buffer.split(b'\n') # 或者使用 b'\r\n' 根据你的需要 + # 最后一个元素可能不包含完整的行,所以将其保留作为新的缓存 + self.buffer = lines.pop() + # 处理每一行数据 + for line in lines: + # 注意:每行数据可能不包含结尾的换行符,所以在处理前检查一下 + if line.endswith(b'\r'): + line = line[:-1] # 移除回车 + lineUtf8 = line.decode('utf-8') + if "end" in lineUtf8.lower() or len(self.bigdata)>4999: + tansData = (range(len(self.bigdata)),self.bigdata) + self.chart_dialog.tans_data(tansData) + self.chart_dialog.draw_figure() + + self.bigdata = [] + elif lineUtf8.isdigit(): + self.bigdata.append(float(lineUtf8)) + #print(f'bigdata length:{len(self.bigdata)}') + + except: + return None + + def send_data_clear(self): self.textEditSend.setText("") @@ -619,6 +657,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.radioButtonCH4TF.setEnabled(False) self.radioButtonOtherData.setEnabled(False) self.checkBoxAutoSaveCsv.setEnabled(True) + self.pushButton_bigdata.setEnabled(False) if self.radioButtonCH4QX.isChecked(): self.comboBoxPlot.addItems(["甲烷浓度","环境温度","激光器温度","激光强度"]) @@ -650,6 +689,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.radioButtonCH4TF.setEnabled(True) self.radioButtonOtherData.setEnabled(True) self.checkBoxAutoSaveCsv.setEnabled(False) + self.pushButton_bigdata.setEnabled(True) self.comboBoxPlot.clear() self.CsvFlag = 0 @@ -690,6 +730,16 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): if ok and new_name: button.setText(new_name) + def bigdata_show(self): + if self.flag_bigdata == 0: + self.chart_dialog.show() + self.flag_bigdata = 1 + self.checkBoxAutoSaveLog.setChecked(False) + else: + self.chart_dialog.close() + self.flag_bigdata = 0 + self.checkBoxAutoSaveLog.setChecked(True) + #执行 if __name__ == '__main__': diff --git a/PyUartAssistant/PyUartUi.py b/PyUartAssistant/PyUartUi.py index 4ffd09c..f515b63 100644 --- a/PyUartAssistant/PyUartUi.py +++ b/PyUartAssistant/PyUartUi.py @@ -362,6 +362,9 @@ class Ui_UartAssistant(object): self.comboBoxPlot.setSizePolicy(sizePolicy) self.comboBoxPlot.setObjectName("comboBoxPlot") self.horizontalLayout_8.addWidget(self.comboBoxPlot) + self.pushButton_bigdata = QtWidgets.QPushButton(self.widget_2) + self.pushButton_bigdata.setGeometry(QtCore.QRect(330, 40, 75, 20)) + self.pushButton_bigdata.setObjectName("pushButton_bigdata") self.verticalLayout_4.addWidget(self.widget_2) self.plot_view = QChartView(self.tab_2) self.plot_view.setEnabled(True) @@ -713,6 +716,7 @@ class Ui_UartAssistant(object): self.radioButtonOtherData.setText(_translate("UartAssistant", "其他数据")) self.checkBoxAutoSaveCsv.setText(_translate("UartAssistant", "自动保存Csv(慢)")) self.pushButtonStopPlot.setText(_translate("UartAssistant", "停止绘图")) + self.pushButton_bigdata.setText(_translate("UartAssistant", "大数据模式")) self.pushButtonResetPlot.setText(_translate("UartAssistant", "重置图形")) self.label_SendNum_2.setText(_translate("UartAssistant", "当前数值")) self.label_SendNum_3.setText(_translate("UartAssistant", "窗口均值")) diff --git a/PyUartAssistant/PyUartUi.ui b/PyUartAssistant/PyUartUi.ui index 81a13a1..1eb6ea1 100644 --- a/PyUartAssistant/PyUartUi.ui +++ b/PyUartAssistant/PyUartUi.ui @@ -670,7 +670,7 @@ false - 1 + 0 @@ -912,6 +912,19 @@ + + + + 330 + 40 + 75 + 20 + + + + 大数据模式 + + diff --git a/PyUartAssistant/ReName_Button.py b/PyUartAssistant/ReName_Button.py new file mode 100644 index 0000000..4121459 --- /dev/null +++ b/PyUartAssistant/ReName_Button.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon Sep 23 09:34:24 2024 + +@author: WANGXIBAO +""" + +from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QVBoxLayout, QDialog, QDialogButtonBox, QMessageBox + +class RenameDialog(QDialog): + def __init__(self, old_name, parent=None): + super().__init__(parent) + self.old_name = old_name + self.init_ui() + + def init_ui(self): + layout = QVBoxLayout(self) + self.lineEdit = QLineEdit(self.old_name) + layout.addWidget(self.lineEdit) + self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.buttonBox.accepted.connect(self.accept) + self.buttonBox.rejected.connect(self.reject) + layout.addWidget(self.buttonBox) + + def get_new_name(self): + return self.lineEdit.text() + +class MainWindow(QWidget): + def __init__(self): + super().__init__() + self.init_ui() + + def init_ui(self): + layout = QVBoxLayout(self) + self.pushButton = QPushButton('Click or Double Click to Rename') + self.pushButton.setFixedSize(200, 50) + self.pushButton.clicked.connect(self.rename_button) + layout.addWidget(self.pushButton) + self.setLayout(layout) + + def rename_button(self): + clicked_button = self.sender() + if clicked_button: + dialog = RenameDialog(clicked_button.text(), self) + if dialog.exec_(): + new_name = dialog.get_new_name() + if new_name: # 确保新名称不为空 + clicked_button.setText(new_name) + else: + QMessageBox.warning(self, "Rename Error", "The new name cannot be empty.") + +if __name__ == '__main__': + app = QApplication([]) + window = MainWindow() + window.show() + app.exec_() \ No newline at end of file diff --git a/PyUartAssistant/regular.ini b/PyUartAssistant/regular.ini index 250e622..9a8dae4 100644 --- a/PyUartAssistant/regular.ini +++ b/PyUartAssistant/regular.ini @@ -11,7 +11,7 @@ button03 = write 3,0|B*1000 button04 = write 4,0|可调电阻 button05 = write 5,30|电阻抽头 button06 = write 6,0|输出温度 -button07 = write 7,0|输出激光 +button07 = write 7,1|输出激光 button08 = write 8,1|输出状态 button09 = write 9,0|激光温补 button10 = write 10,100|噪声长度