diff --git a/PyMaiHak/PyHex.exe b/PyMaiHak/PyHex.exe index 4874a2f..413c3c6 100644 Binary files a/PyMaiHak/PyHex.exe and b/PyMaiHak/PyHex.exe differ diff --git a/PyMaiHak/PyHex.py b/PyMaiHak/PyHex.py index 1a023af..40cf826 100644 --- a/PyMaiHak/PyHex.py +++ b/PyMaiHak/PyHex.py @@ -27,6 +27,9 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form): self.bytes_length = int(config.get('NetConfig', 'bytes_length')) self.num_scale = int(config.get('NetConfig', 'num_scale')) self.log_time = int(config.get('NetConfig', 'log_time')) + windowTitle = config.get('NetConfig', 'window_title') + self.setWindowTitle(windowTitle) + self.log_count = 0 self.log_buffer = [] # 定时器接收数据 @@ -55,6 +58,7 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form): try: self.udp_socket.bind(udp_addr) print("开始监听。。。") + self.udp_socket.setblocking(False) #设置非阻塞 except Exception as e: print(f"Error reading configuration: {e}") return None @@ -72,6 +76,8 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form): out_s = '' out_s = ' '.join(['{:02X}'.format(b) for b in bytes.fromhex(line_utf8)]) + # %% 在界面上更新 + self.add_line_to_textedit(out_s) # 获取到text光标 textCursor = self.textEdit.textCursor() # 滚动到底部 @@ -79,11 +85,12 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form): # 设置光标到text中去 self.textEdit.setTextCursor(textCursor) - self.textEdit.insertPlainText(out_s) - self.textEdit.insertPlainText('\r\n') + # self.textEdit.insertPlainText(out_s) + # self.textEdit.insertPlainText('\r\n') + print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], out_s)) - + #%%保存数据到log sav_str = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] +" " +out_s +"\r\n" #将数据加入缓存区域 self.log_buffer.append(sav_str) @@ -92,20 +99,20 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form): if self.log_count>self.log_time: self.data_save() - #数据转化 + #%% 数据转化,并显示在框中 num_hex_str = line_utf8[self.bytes_start*2:(self.bytes_start*2 +self.bytes_length*2 )] - num_out = int(num_hex_str,16)/self.num_scale + if num_hex_str: + num_out = int(num_hex_str,16)/self.num_scale + self.textBrowser.clear() + # 设置字体和颜色 + char_format = QtGui.QTextCharFormat() + char_format.setFont(QtGui.QFont("SimSun", 28)) # 设置字体为 SimSun,字号为 28 + char_format.setForeground(QtGui.QBrush(QtGui.QColor("red"))) # 设置文字颜色为红色 + # 创建 QTextCursor 对象 + cursor = self.textBrowser.textCursor() # 插入带有格式的文本 + cursor.insertText(str(num_out), char_format) - self.textBrowser.clear() - - # 设置字体和颜色 - char_format = QtGui.QTextCharFormat() - char_format.setFont(QtGui.QFont("SimSun", 28)) # 设置字体为 SimSun,字号为 28 - char_format.setForeground(QtGui.QBrush(QtGui.QColor("red"))) # 设置文字颜色为红色 - # 创建 QTextCursor 对象 - cursor = self.textBrowser.textCursor() # 插入带有格式的文本 - cursor.insertText(str(num_out), char_format) except socket.error as e: #print(f"Socket error: {e}") pass @@ -116,6 +123,18 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form): file.writelines(self.log_buffer) self.log_buffer.clear() self.log_count = 0 + + def add_line_to_textedit(self, new_line): + # 获取当前文本并按行分割 + current_lines = self.textEdit.toPlainText().splitlines() + # 添加新的行到列表中 + current_lines.append(new_line) + # 如果行数超过100,则删除最早的行,直到剩下100行 + if len(current_lines) > 100: + current_lines = current_lines[-100:] # 只保留最新的100行 + # 将更新后的行列表转换回字符串并设置为textEdit的内容 + self.textEdit.setPlainText('\n'.join(current_lines)) + def CheckCfgIniData(self): if not os.path.exists(self.udp): @@ -127,6 +146,7 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form): config.set('NetConfig', 'bytes_length', '4') config.set('NetConfig', 'num_scale', '1000') config.set('NetConfig', 'log_time', '1') + config.set('NetConfig', 'window_title', 'Hex数据解调工具') with open(self.udp, 'w', encoding='utf-8') as f: config.write(f) diff --git a/PyMaiHak/pyHex.ini b/PyMaiHak/pyHex.ini index 45ed700..eadfd7e 100644 --- a/PyMaiHak/pyHex.ini +++ b/PyMaiHak/pyHex.ini @@ -4,5 +4,6 @@ port = 9000 bytes_start = 3 bytes_length = 4 num_scale = 1000 -log_time= 10 +log_time = 1 +window_title = Hex数据解调工具 diff --git a/PyUartAssistant/PyUart.py b/PyUartAssistant/PyUart.py index 984e16e..07f13ac 100644 --- a/PyUartAssistant/PyUart.py +++ b/PyUartAssistant/PyUart.py @@ -5,7 +5,7 @@ Created on Mon May 27 14:31:38 2024 @author: WANGXIBAO """ -import sys +import sys,os import serial,re import serial.tools.list_ports import time,datetime @@ -13,28 +13,35 @@ import time,datetime from PyQt5 import QtWidgets from PyQt5.Qt import QPainter from PyQt5.QtWidgets import QMessageBox ,QFileDialog,QInputDialog -from PyQt5.QtCore import QTimer ,Qt +from PyQt5.QtCore import QTimer from PyUartUi import Ui_UartAssistant -from UartDataPolt import QChartViewPlot,UpdateDataThread,GetDataQX,GetDataTF,GetDataOther +from UartDataPolt import QChartViewPlot,UpdateDataThread,GetDataTF from PyQt5.QtChart import QChartView from PyQt5.QtGui import QIcon - +from configparser import ConfigParser class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): # %%初始化程序 def __init__(self): super(PyQt5Serial, self).__init__() self.setupUi(self) + self.quick_num = 99 + self.IniPath = "PyUart.ini" + self.log_time = 10 + self.log_buffer = {} #定义成一个字典,键--文件名,值--对于收到的字符串列表 + self.qxCfg=() + self.tfCfg=() + self.otCfg=() + self.current_lines = [] #定义一个空列表,存储待显示数据 + self.update_data_thread = UpdateDataThread() # 创建更新波形数据线程 - self.get_data_qx = GetDataQX() - self.get_data_qx.IndOfReturn(0) #根据数据特点给一个初始值 self.get_data_tf = GetDataTF() self.get_data_tf.IndOfReturn(0) #根据数据特点给一个初始值 - self.get_data_other = GetDataOther() - self.get_data_other.IndOfReturn(0) #根据数据特点给一个初始值 self.init() + self.CheckCfgIniData() #更改按钮的文字 + self.ser = serial.Serial() #创建一个空对象 self.port_check() @@ -73,23 +80,14 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): #加载快捷指令 self.widget_6.hide() #加载快捷指令的按键值 - - for i in range(1, 21): # 假设有20个按钮 - getattr(self, f'pushButtonQuick_{i}').setText(self.get_data_tf.buttons_config[i-1][2]) - getattr(self, f'lineEditQuick_{i}').setText(self.get_data_tf.buttons_config[i-1][1]) - - # ( - # lambda checked, line_edit=f'lineEditQuick_{i}': self.onPushButtonQuickClicked(line_edit) - # ) - - # 用于暂存接收的串口数据 self.buffer = b'' # 用于暂存解码数据 self.lineUtf8 = "" # 用于标志是否开始存CSV - self.CsvFlag = 0 + self.flag_draw = 0 + self.double_click_timers = {} # 存储双击定时器 # ============================================================================= # def wheelEvent(self, event): # if self.plot_view.underMouse: @@ -122,10 +120,13 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.port_close() #关闭界面前保存快捷区域的命令和名称 - for i in range(20): # 假设有20个按钮 - button_name = f'Button{i:02}' # 格式化按钮名称,确保两位数 - set_text = getattr(self, f'lineEditQuick_{i+1}').text()+ "|" + getattr(self, f'pushButtonQuick_{i+1}').text() - self.get_data_tf.SetCfgIniData(button_name, set_text) + for i in range(self.quick_num): # 假设有20个按钮 + index_str = f"{i:02}" # 确保编号为两位数字形式 + lineEditName = f"lineEditQuick_{index_str}" + buttonName = f"pushButtonQuick_{index_str}" # 格式化按钮名称,确保两位数 + button_name = f"button{index_str}" + set_text = getattr(self,lineEditName).text()+ "|" + getattr(self,buttonName).text() + self.SetCfgIniData(button_name, set_text) @@ -158,8 +159,8 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): # 加载日志 self.pushButtonLogLoad.clicked.connect(self.openfiles) - # 跳转链接 - #self.commandLinkButton1.clicked.connect(self.link) + # hexRecevie与savCsv的按键关联 + self.checkBoxHexReceive.stateChanged.connect(self.hex_link_savCsv) # 清除发送按钮 self.pushButtonClearSend.clicked.connect(self.send_data_clear) @@ -180,20 +181,28 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): # 快捷指令扩展区域 self.pushButton_expend.clicked.connect(self.adjust_sidebar) # 创建一个通用的槽函数来处理所有按钮 -# 例如,使用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) - # ) - # 连接左键点击事件 - button = getattr(self, f'pushButtonQuick_{i}') - line_edit = f'lineEditQuick_{i}' - button.clicked.connect(lambda checked, line_edit=line_edit: self.onPushButtonQuickClicked(line_edit)) - - # 连接右键点击事件 - button_id = f'pushButtonQuick_{i}' - button.setContextMenuPolicy(Qt.CustomContextMenu) - button.customContextMenuRequested.connect(lambda position, button_id=button_id: self.onButtonRightClicked(button_id)) + # 动态创建控件并存储引用 + for i in range(self.quick_num): # 从0到20 + index_str = f"{i:02}" # 确保编号为两位数字形式 + horizontalLayoutName = f"horizontalLayoutQuick_{index_str}" + horizontalLayout = QtWidgets.QHBoxLayout() + horizontalLayout.setObjectName(horizontalLayoutName) + + # 创建 QLineEdit 并设置动态属性 + lineEditName = f"lineEditQuick_{index_str}" + setattr(self, lineEditName, QtWidgets.QLineEdit(self.layoutWidget1)) + getattr(self, lineEditName).setObjectName(lineEditName) + horizontalLayout.addWidget(getattr(self, lineEditName)) + # 创建 QPushButton 并设置动态属性 + buttonName = f"pushButtonQuick_{index_str}" + setattr(self, buttonName, QtWidgets.QPushButton(self.layoutWidget1)) + getattr(self, buttonName).setObjectName(buttonName) + horizontalLayout.addWidget(getattr(self, buttonName)) + self.verticalLayout_8.addLayout(horizontalLayout) + # 连接按钮点击事件到槽函数 + button = getattr(self, buttonName) + if button: + button.clicked.connect(lambda checked, idx=i: self.onButtonClick(idx)) # %% 串口检测 def port_check(self): @@ -213,7 +222,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): def port_open(self): self.ser.port = self.comboBoxSerial.currentText() # 串口号 self.ser.baudrate = int(self.comboBoxBaudrate.currentText()) # 波特率 - self.ser.timeout = 0.01 + self.ser.timeout = 0.001 @@ -304,23 +313,26 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): if self.checkBoxAddDate.isChecked(): nowTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") nowTime = nowTime[:-3] - self.textEditReceive.insertPlainText(nowTime + " ") - + #self.textEditReceive.insertPlainText(nowTime + " ") + self.add_line_to_textedit(nowTime + " ") # HEX显示数据 if self.checkBoxHexReceive.checkState(): out_s = '' for i in range(0, len(data)): out_s = out_s + '{:02X}'.format(data[i]) + ' ' - self.textEditReceive.insertPlainText(out_s) + #self.textEditReceive.insertPlainText(out_s) + self.add_line_to_textedit(out_s) # ASCII显示数据 else: #print("解码前",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")) - self.textEditReceive.insertPlainText(data.decode('utf-8',errors='replace')) + #self.textEditReceive.insertPlainText(data.decode('utf-8',errors='replace')) + self.add_line_to_textedit(data.decode('utf-8',errors='replace')) #print("解码数据",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")) # 接收换行 if self.checkBoxCRLF.isChecked(): - self.textEditReceive.insertPlainText('\r\n') + #self.textEditReceive.insertPlainText('\r\n') + self.add_line_to_textedit('\r\n') # 获取到text光标 textCursor = self.textEditReceive.textCursor() @@ -422,7 +434,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.textEditReceive.insertPlainText(out_s) # ASCII接收显示 else: - self.textEditReceive.insertPlainText(input_s.decode('utf-8')) + self.textEditReceive.insertPlainText(input_s.decode('utf-8',errors='replace')) # 接收换行 if self.checkBoxCRLF.isChecked(): @@ -483,48 +495,48 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): # 注意:每行数据可能不包含结尾的换行符,所以在处理前检查一下 if line.endswith(b'\r'): line = line[:-1] # 移除回车 - # 写入当前日期的文件,打开文件,如果文件不存在则创建,如果存在则追加内容 - - 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" - #print("saveData:",saveData) - file.write(saveData) # 写入内容 + if self.checkBoxHexReceive.checkState(): + lineUtf8 = line.hex() + out_s = ' '.join(['{:02X}'.format(b) for b in bytes.fromhex(lineUtf8)]) + saveData = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] +" " +out_s +"\r\n" + else: + lineUtf8 = line.decode('utf-8',errors='replace') + saveData = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " " + lineUtf8 + "\r\n" + + # 将日志信息添加到缓冲区 + if self.filename not in self.log_buffer: + self.log_buffer[self.filename] = [] + self.log_buffer[self.filename].append(saveData) + + # 当缓冲区中的记录达到10条时,写入文件 + if len(self.log_buffer[self.filename]) >= self.log_time: + with open(self.filename, mode='a', newline='',encoding='utf-8', errors='replace') as file: + file.writelines(self.log_buffer[self.filename]) + self.log_buffer[self.filename].clear() + + + #判断选择的何种格式数据 - if self.radioButtonCH4QX.isChecked() and self.lineUtf8[:2]=="A+": - print(self.lineUtf8) + if self.radioButtonCH4QX.isChecked(): + self.get_data_tf.SetConfig(self.qxCfg) + if self.radioButtonCH4TF.isChecked(): + self.get_data_tf.SetConfig(self.tfCfg) + if self.radioButtonOtherData.isChecked(): + self.get_data_tf.SetConfig(self.otCfg) - dataSplit = self.get_data_qx.Transdata(self.lineUtf8) - self.filenameCsv= self.file + ".csv" - if self.checkBoxAutoSaveCsv.isChecked() and self.CsvFlag: #写入CSV文件 - try: - self.get_data_qx.SaveCsv(self.filenameCsv) - except: - print("写入CSV失败") - pass + print(lineUtf8) + + if self.flag_draw: - self.update_data_thread.SetFlag(1) - self.update_data_thread.SetReceiveData(dataSplit) - #更新当前数据 - self.lineEditCurrentValue.setText(str(round(dataSplit,3))) - self.lineEditWindowMean.setText (str(round(self.plot_qchart.windowAverage,3))) - self.lineEditWindowMSE.setText (str(round(self.plot_qchart.windowStd,3))) - #print(dataSplit) - #print("接收发数",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")) - elif self.radioButtonCH4TF.isChecked() : - print(self.lineUtf8) - - dataSplit = self.get_data_tf.Transdata(self.lineUtf8) + dataSplit = self.get_data_tf.Transdata(lineUtf8) #print("dataSplit",type(dataSplit)) if isinstance(dataSplit, (float, int)): self.filenameCsv= self.file + ".csv" - if self.checkBoxAutoSaveCsv.isChecked() and self.CsvFlag: #写入CSV文件 + if self.checkBoxAutoSaveCsv.isChecked(): #写入CSV文件 try: - self.get_data_tf.SaveCsv(self.filenameCsv) + self.get_data_tf.SaveCsv(self.filenameCsv,self.log_time) except: print("写入CSV失败") pass @@ -537,31 +549,7 @@ 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)) - elif self.radioButtonOtherData.isChecked() : - print(self.lineUtf8) - - dataSplit = self.get_data_other.Transdata(self.lineUtf8) - #print("dataSplit",type(dataSplit)) - if isinstance(dataSplit, (float, int)): - - self.filenameCsv= self.file + ".csv" - if self.checkBoxAutoSaveCsv.isChecked() and self.CsvFlag: #写入CSV文件 - try: - self.get_data_other.SaveCsv(self.filenameCsv) - except: - print("写入CSV失败") - pass - - self.update_data_thread.SetFlag(1) - #print("dataSplit",dataSplit) - self.update_data_thread.SetReceiveData(dataSplit) - #更新当前数据 - self.lineEditCurrentValue.setText(str(round(dataSplit,3))) - 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("Data split failed, dataSplit type:",type(dataSplit)) except Exception as e: print(f"Error reading configuration: {e}") @@ -581,7 +569,25 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.data_num_received = 0 self.lineEditSendNum.setText(str(self.data_num_received)) - + # 关联hex接收与保存csv,hex下不保存csv + def hex_link_savCsv(self): + if self.checkBoxHexReceive.isChecked(): + self.checkBoxAutoSaveCsv.setChecked(False) + else: + self.checkBoxAutoSaveCsv.setChecked(True) + + #设置接受区域显示条数 + def add_line_to_textedit(self, new_line): + # 获取当前文本并按行分割 + #current_lines = self.textEditReceive.toPlainText().splitlines() + # 添加新的行到列表中 + self.current_lines.append(new_line) + # 如果行数超过100,则删除最早的行,直到剩下100行 + if len(self.current_lines) > 1000: + self.current_lines = self.current_lines[-1000:] # 只保留最新的100行 + # 将更新后的行列表转换回字符串并设置为textEdit的内容 + self.textEditReceive.setPlainText(''.join(self.current_lines)) + #self.textEditReceive.setPlainText(self.current_lines) # 关闭串口 def port_close(self): try: @@ -607,6 +613,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.lineEditReceiveNum.setText(str(self.data_num_received)) #self.formGroupBox1.setTitle("串口状态(关闭)") + #开始绘图 def btn_start_clicked(self): #开启按钮 @@ -620,28 +627,18 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.radioButtonOtherData.setEnabled(False) self.checkBoxAutoSaveCsv.setEnabled(True) - if self.radioButtonCH4QX.isChecked(): - self.comboBoxPlot.addItems(["甲烷浓度","环境温度","激光器温度","激光强度"]) - self.comboBoxPlot.setCurrentText("甲烷浓度") - self.get_data_qx.IndOfReturn(0) - elif self.radioButtonCH4TF.isChecked(): - iterm = self.get_data_tf.rowTitle[1:] - print("iterm",iterm) - self.comboBoxPlot.addItems(iterm) - - elif self.radioButtonOtherData.isChecked(): - iterm = self.get_data_other.rowTitle[1:] - print("iterm",iterm) - self.comboBoxPlot.addItems(iterm) - - #self.update_data_thread.SetPlotItem(0) + iterm = self.get_data_tf.rowTitle[1:] + print("iterm",iterm) + self.comboBoxPlot.addItems(iterm) + + self.update_data_thread.SetPlotItem(0) self.update_data_thread.restart() - self.CsvFlag = 1 + self.flag_draw = 1 - + #停止绘图 def btn_stop_clicked(self): self.update_data_thread.stop() self.pushButtonStartPlot.setEnabled(True) @@ -651,22 +648,18 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): self.radioButtonOtherData.setEnabled(True) self.checkBoxAutoSaveCsv.setEnabled(False) self.comboBoxPlot.clear() - self.CsvFlag = 0 + self.flag_draw = 0 def update_data_thread_slot(self, data): # 线程回调函数 #data = json.loads(data) self.plot_qchart.handle_update(float(data)) #print("thread ",data) - + def plot_item_changed(self,index): print(index) self.plot_qchart.clearSeries() - #self.update_data_thread.SetPlotItem(index) - self.get_data_qx.IndOfReturn(index) - #self.plot_qchart.series.replace([]) self.get_data_tf.IndOfReturn(index) - self.get_data_other.IndOfReturn(index) def plot_reset(self): self.plot_qchart.zoomReset() @@ -682,15 +675,110 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant): if self.checkBox_return.isChecked(): text = text + "\r\n" self.data_send(text) - - def onButtonRightClicked(self, button_id): - # 弹出一个对话框让用户输入新的按钮名称 - button = getattr(self, button_id) + + + def CheckCfgIniData(self): + if not os.path.exists(self.IniPath): + config = ConfigParser() + #数据处理正则表达 + config.add_section('QX_config') + config.set('QX_config', 'regular', '\+?-?\d+(?:\.\d+)?') + config.set('QX_config', 'headStr', 'A+') + config.set('QX_config', 'rowTitle', 'time,Methane,Air Temp,Laser Temp,Laser Intensity') + + config.add_section('TF_config') + config.set('TF_config', 'regular', '\+?-?\d+(?:\.\d+)?') + config.set('TF_config', 'headStr', 'A+') + config.set('TF_config', 'rowTitle', 'time,Methane,Air Temp,Laser Temp,Laser Intensity,amplification,NL,ND,Sinal,SNR,PEAK,Best Piont') + + config.add_section('OtherData_config') + config.set('OtherData_config', 'regular', '\+?-?\d+(?:\.\d+)?') + # config.set('TF_config', 'regular', '(A\+|B\+|\s)+') + config.set('OtherData_config', 'headStr', 'A+') + config.set('OtherData_config', 'rowTitle', 'time,DATA1,DATA2') + + #按键配置 + config.add_section('Quick_config') + config.set('Quick_config', 'log_time', '10') + for i in range(self.quick_num): + idx = f'{i:02}' + button_name = f'Button{idx}' # 格式化按钮名称,确保两位数 + config.set('Quick_config', button_name, '') + with open(self.IniPath, 'w' ,encoding='utf-8') as f: + config.write(f) + + config = ConfigParser() + config.read(self.IniPath, encoding='utf-8') + try: + + # 创建一个空字典来存储按钮名称和对应的配置 + self.log_time = int(config.get('Quick_config', 'log_time')) + self.qxCfg = (config.get('QX_config','regular'),config.get('QX_config','headStr'),config.get('QX_config','rowTitle')) + print('Quick_config:',self.qxCfg) + self.tfCfg = (config.get('TF_config','regular'),config.get('TF_config','headStr'),config.get('TF_config','rowTitle')) + print('TF_config:',self.tfCfg) + self.otCfg = (config.get('OtherData_config','regular'),config.get('OtherData_config','headStr'),config.get('OtherData_config','rowTitle')) + print('OtherData_config:',self.otCfg) + + # 循环遍历按钮编号,从0到19 + for i in range(self.quick_num): + idx = f'{i:02}' + button_name = f'Button{idx}' # 格式化按钮名称,确保两位数 + # 使用 get 方法安全地获取配置,如果不存在则返回空字符串 + config_value = config.get('Quick_config', button_name, fallback='') + config_value_split = config_value.split('|') + # 将按钮名称和配置信息存储在字典中 + if len(config_value_split) == 2: + # 打印字典查看结果,并赋值 + print(button_name,config_value_split[0],config_value_split[1]) + getattr(self, f'pushButtonQuick_{idx}').setText(config_value_split[1]) + getattr(self, f'lineEditQuick_{idx}').setText(config_value_split[0]) + + except Exception as e: + print(f"Error reading configuration: {e}") + + + def SetCfgIniData(self,button_name,set_text): + config = ConfigParser() + config.read(self.IniPath, encoding='utf-8') + config.set('Quick_config', button_name, set_text) + with open(self.IniPath, 'w' ,encoding='utf-8') as f: + config.write(f) + + + def onButtonClick(self, idx): + # 槽函数处理按钮点击事件 + + if idx not in self.double_click_timers: + self.double_click_timers[idx] = None + + if self.double_click_timers[idx] is None: + self.double_click_timers[idx] = True + QTimer.singleShot(200, lambda: self.onButtonSigleClick(idx)) + else: + self.onButtonDoubleClick(idx) + + def onButtonSigleClick(self, idx): + index_str = f"{idx:02}" + if self.double_click_timers[idx]: + self.double_click_timers[idx] = None + lineEdit = getattr(self, f"lineEditQuick_{index_str}") + print(f"Text in lineEdit_{idx}: {lineEdit.text()}") + text = lineEdit.text() + if self.checkBox_return.isChecked(): + text = text + "\r\n" + self.data_send(text) + + def onButtonDoubleClick(self, idx): + # 槽函数处理按钮双击事件 + self.double_click_timers[idx] = None + index_str = f"{idx:02}" + print(f"Double click detected on Button {index_str}.") + button = getattr(self, f"pushButtonQuick_{index_str}") new_name, ok = QInputDialog.getText(self, 'Button Rename', 'Enter new button name:') if ok and new_name: button.setText(new_name) - - + #执行 if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) diff --git a/PyUartAssistant/PyUartUi.py b/PyUartAssistant/PyUartUi.py index 4ffd09c..8817eb4 100644 --- a/PyUartAssistant/PyUartUi.py +++ b/PyUartAssistant/PyUartUi.py @@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_UartAssistant(object): def setupUi(self, UartAssistant): UartAssistant.setObjectName("UartAssistant") - UartAssistant.resize(996, 694) + UartAssistant.resize(999, 694) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(2) sizePolicy.setVerticalStretch(0) @@ -430,7 +430,7 @@ class Ui_UartAssistant(object): self.scrollArea.setWidgetResizable(False) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 241, 1000)) + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 241, 3000)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.widget_8 = QtWidgets.QWidget(self.scrollAreaWidgetContents) self.widget_8.setGeometry(QtCore.QRect(12, 2, 221, 34)) @@ -446,194 +446,14 @@ class Ui_UartAssistant(object): self.checkBox_return.setObjectName("checkBox_return") self.horizontalLayout_17.addWidget(self.checkBox_return) self.widget_9 = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget_9.setGeometry(QtCore.QRect(12, 42, 236, 1000)) + self.widget_9.setGeometry(QtCore.QRect(12, 42, 231, 3000)) self.widget_9.setObjectName("widget_9") self.layoutWidget2 = QtWidgets.QWidget(self.widget_9) - self.layoutWidget2.setGeometry(QtCore.QRect(12, 12, 218, 616)) + self.layoutWidget2.setGeometry(QtCore.QRect(12, 12, 201, 2801)) self.layoutWidget2.setObjectName("layoutWidget2") self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.layoutWidget2) self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) self.verticalLayout_8.setObjectName("verticalLayout_8") - self.horizontalLayoutQuick_1 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_1.setObjectName("horizontalLayoutQuick_1") - self.lineEditQuick_1 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_1.setObjectName("lineEditQuick_1") - self.horizontalLayoutQuick_1.addWidget(self.lineEditQuick_1) - self.pushButtonQuick_1 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_1.setObjectName("pushButtonQuick_1") - self.horizontalLayoutQuick_1.addWidget(self.pushButtonQuick_1) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_1) - self.horizontalLayoutQuick_2 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_2.setObjectName("horizontalLayoutQuick_2") - self.lineEditQuick_2 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_2.setObjectName("lineEditQuick_2") - self.horizontalLayoutQuick_2.addWidget(self.lineEditQuick_2) - self.pushButtonQuick_2 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_2.setObjectName("pushButtonQuick_2") - self.horizontalLayoutQuick_2.addWidget(self.pushButtonQuick_2) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_2) - self.horizontalLayoutQuick_3 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_3.setObjectName("horizontalLayoutQuick_3") - self.lineEditQuick_3 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_3.setObjectName("lineEditQuick_3") - self.horizontalLayoutQuick_3.addWidget(self.lineEditQuick_3) - self.pushButtonQuick_3 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_3.setObjectName("pushButtonQuick_3") - self.horizontalLayoutQuick_3.addWidget(self.pushButtonQuick_3) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_3) - self.horizontalLayoutQuick_4 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_4.setObjectName("horizontalLayoutQuick_4") - self.lineEditQuick_4 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_4.setObjectName("lineEditQuick_4") - self.horizontalLayoutQuick_4.addWidget(self.lineEditQuick_4) - self.pushButtonQuick_4 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_4.setObjectName("pushButtonQuick_4") - self.horizontalLayoutQuick_4.addWidget(self.pushButtonQuick_4) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_4) - self.horizontalLayoutQuick_5 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_5.setObjectName("horizontalLayoutQuick_5") - self.lineEditQuick_5 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_5.setObjectName("lineEditQuick_5") - self.horizontalLayoutQuick_5.addWidget(self.lineEditQuick_5) - self.pushButtonQuick_5 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_5.setObjectName("pushButtonQuick_5") - self.horizontalLayoutQuick_5.addWidget(self.pushButtonQuick_5) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_5) - self.horizontalLayoutQuick_6 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_6.setObjectName("horizontalLayoutQuick_6") - self.lineEditQuick_6 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_6.setObjectName("lineEditQuick_6") - self.horizontalLayoutQuick_6.addWidget(self.lineEditQuick_6) - self.pushButtonQuick_6 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_6.setObjectName("pushButtonQuick_6") - self.horizontalLayoutQuick_6.addWidget(self.pushButtonQuick_6) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_6) - self.horizontalLayoutQuick_7 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_7.setObjectName("horizontalLayoutQuick_7") - self.lineEditQuick_7 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_7.setObjectName("lineEditQuick_7") - self.horizontalLayoutQuick_7.addWidget(self.lineEditQuick_7) - self.pushButtonQuick_7 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_7.setObjectName("pushButtonQuick_7") - self.horizontalLayoutQuick_7.addWidget(self.pushButtonQuick_7) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_7) - self.horizontalLayoutQuick_8 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_8.setObjectName("horizontalLayoutQuick_8") - self.lineEditQuick_8 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_8.setObjectName("lineEditQuick_8") - self.horizontalLayoutQuick_8.addWidget(self.lineEditQuick_8) - self.pushButtonQuick_8 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_8.setObjectName("pushButtonQuick_8") - self.horizontalLayoutQuick_8.addWidget(self.pushButtonQuick_8) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_8) - self.horizontalLayoutQuick_9 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_9.setObjectName("horizontalLayoutQuick_9") - self.lineEditQuick_9 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_9.setObjectName("lineEditQuick_9") - self.horizontalLayoutQuick_9.addWidget(self.lineEditQuick_9) - self.pushButtonQuick_9 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_9.setObjectName("pushButtonQuick_9") - self.horizontalLayoutQuick_9.addWidget(self.pushButtonQuick_9) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_9) - self.horizontalLayoutQuick_10 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_10.setObjectName("horizontalLayoutQuick_10") - self.lineEditQuick_10 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_10.setObjectName("lineEditQuick_10") - self.horizontalLayoutQuick_10.addWidget(self.lineEditQuick_10) - self.pushButtonQuick_10 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_10.setObjectName("pushButtonQuick_10") - self.horizontalLayoutQuick_10.addWidget(self.pushButtonQuick_10) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_10) - self.horizontalLayoutQuick_11 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_11.setObjectName("horizontalLayoutQuick_11") - self.lineEditQuick_11 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_11.setObjectName("lineEditQuick_11") - self.horizontalLayoutQuick_11.addWidget(self.lineEditQuick_11) - self.pushButtonQuick_11 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_11.setObjectName("pushButtonQuick_11") - self.horizontalLayoutQuick_11.addWidget(self.pushButtonQuick_11) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_11) - self.horizontalLayoutQuick_12 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_12.setObjectName("horizontalLayoutQuick_12") - self.lineEditQuick_12 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_12.setObjectName("lineEditQuick_12") - self.horizontalLayoutQuick_12.addWidget(self.lineEditQuick_12) - self.pushButtonQuick_12 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_12.setObjectName("pushButtonQuick_12") - self.horizontalLayoutQuick_12.addWidget(self.pushButtonQuick_12) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_12) - self.horizontalLayoutQuick_13 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_13.setObjectName("horizontalLayoutQuick_13") - self.lineEditQuick_13 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_13.setObjectName("lineEditQuick_13") - self.horizontalLayoutQuick_13.addWidget(self.lineEditQuick_13) - self.pushButtonQuick_13 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_13.setObjectName("pushButtonQuick_13") - self.horizontalLayoutQuick_13.addWidget(self.pushButtonQuick_13) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_13) - self.horizontalLayoutQuick_14 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_14.setObjectName("horizontalLayoutQuick_14") - self.lineEditQuick_14 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_14.setObjectName("lineEditQuick_14") - self.horizontalLayoutQuick_14.addWidget(self.lineEditQuick_14) - self.pushButtonQuick_14 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_14.setObjectName("pushButtonQuick_14") - self.horizontalLayoutQuick_14.addWidget(self.pushButtonQuick_14) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_14) - self.horizontalLayoutQuick_15 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_15.setObjectName("horizontalLayoutQuick_15") - self.lineEditQuick_15 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_15.setObjectName("lineEditQuick_15") - self.horizontalLayoutQuick_15.addWidget(self.lineEditQuick_15) - self.pushButtonQuick_15 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_15.setObjectName("pushButtonQuick_15") - self.horizontalLayoutQuick_15.addWidget(self.pushButtonQuick_15) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_15) - self.horizontalLayoutQuick_16 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_16.setObjectName("horizontalLayoutQuick_16") - self.lineEditQuick_16 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_16.setObjectName("lineEditQuick_16") - self.horizontalLayoutQuick_16.addWidget(self.lineEditQuick_16) - self.pushButtonQuick_16 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_16.setObjectName("pushButtonQuick_16") - self.horizontalLayoutQuick_16.addWidget(self.pushButtonQuick_16) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_16) - self.horizontalLayoutQuick_17 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_17.setObjectName("horizontalLayoutQuick_17") - self.lineEditQuick_17 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_17.setObjectName("lineEditQuick_17") - self.horizontalLayoutQuick_17.addWidget(self.lineEditQuick_17) - self.pushButtonQuick_17 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_17.setObjectName("pushButtonQuick_17") - self.horizontalLayoutQuick_17.addWidget(self.pushButtonQuick_17) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_17) - self.horizontalLayoutQuick_18 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_18.setObjectName("horizontalLayoutQuick_18") - self.lineEditQuick_18 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_18.setObjectName("lineEditQuick_18") - self.horizontalLayoutQuick_18.addWidget(self.lineEditQuick_18) - self.pushButtonQuick_18 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_18.setObjectName("pushButtonQuick_18") - self.horizontalLayoutQuick_18.addWidget(self.pushButtonQuick_18) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_18) - self.horizontalLayoutQuick_19 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_19.setObjectName("horizontalLayoutQuick_19") - self.lineEditQuick_19 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_19.setObjectName("lineEditQuick_19") - self.horizontalLayoutQuick_19.addWidget(self.lineEditQuick_19) - self.pushButtonQuick_19 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_19.setObjectName("pushButtonQuick_19") - self.horizontalLayoutQuick_19.addWidget(self.pushButtonQuick_19) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_19) - self.horizontalLayoutQuick_20 = QtWidgets.QHBoxLayout() - self.horizontalLayoutQuick_20.setObjectName("horizontalLayoutQuick_20") - self.lineEditQuick_20 = QtWidgets.QLineEdit(self.layoutWidget2) - self.lineEditQuick_20.setObjectName("lineEditQuick_20") - self.horizontalLayoutQuick_20.addWidget(self.lineEditQuick_20) - self.pushButtonQuick_20 = QtWidgets.QPushButton(self.layoutWidget2) - self.pushButtonQuick_20.setObjectName("pushButtonQuick_20") - self.horizontalLayoutQuick_20.addWidget(self.pushButtonQuick_20) - self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_20) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.horizontalLayout_16.addWidget(self.scrollArea) self.horizontalLayout_14.addWidget(self.splitter) @@ -719,25 +539,5 @@ class Ui_UartAssistant(object): self.label_SendNum_4.setText(_translate("UartAssistant", "窗口标准差")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("UartAssistant", "曲线绘制")) self.label_8.setText(_translate("UartAssistant", "快捷指令")) - self.checkBox_return.setText(_translate("UartAssistant", "添加\"回车换行\"")) - self.pushButtonQuick_1.setText(_translate("UartAssistant", "Button01")) - self.pushButtonQuick_2.setText(_translate("UartAssistant", "Button02")) - self.pushButtonQuick_3.setText(_translate("UartAssistant", "Button03")) - self.pushButtonQuick_4.setText(_translate("UartAssistant", "Button04")) - self.pushButtonQuick_5.setText(_translate("UartAssistant", "Button05")) - self.pushButtonQuick_6.setText(_translate("UartAssistant", "Button06")) - self.pushButtonQuick_7.setText(_translate("UartAssistant", "Button07")) - self.pushButtonQuick_8.setText(_translate("UartAssistant", "Button08")) - self.pushButtonQuick_9.setText(_translate("UartAssistant", "Button09")) - self.pushButtonQuick_10.setText(_translate("UartAssistant", "Button10")) - self.pushButtonQuick_11.setText(_translate("UartAssistant", "Button11")) - self.pushButtonQuick_12.setText(_translate("UartAssistant", "Button12")) - self.pushButtonQuick_13.setText(_translate("UartAssistant", "Button13")) - self.pushButtonQuick_14.setText(_translate("UartAssistant", "Button14")) - self.pushButtonQuick_15.setText(_translate("UartAssistant", "Button15")) - self.pushButtonQuick_16.setText(_translate("UartAssistant", "Button16")) - self.pushButtonQuick_17.setText(_translate("UartAssistant", "Button17")) - self.pushButtonQuick_18.setText(_translate("UartAssistant", "Button18")) - self.pushButtonQuick_19.setText(_translate("UartAssistant", "Button19")) - self.pushButtonQuick_20.setText(_translate("UartAssistant", "Button20")) + self.checkBox_return.setText(_translate("UartAssistant", "添加\"\\r\\n\"")) from PyQt5.QtChart import QChartView diff --git a/PyUartAssistant/PyUartUi.ui b/PyUartAssistant/PyUartUi.ui index 81a13a1..399a932 100644 --- a/PyUartAssistant/PyUartUi.ui +++ b/PyUartAssistant/PyUartUi.ui @@ -6,7 +6,7 @@ 0 0 - 996 + 999 694 @@ -670,7 +670,7 @@ false - 1 + 0 @@ -1049,7 +1049,7 @@ 0 0 241 - 1000 + 3000 @@ -1072,7 +1072,7 @@ - 添加"回车换行" + 添加"\r\n" true @@ -1086,8 +1086,8 @@ 12 42 - 236 - 1000 + 231 + 3000 @@ -1095,292 +1095,11 @@ 12 12 - 218 - 616 + 201 + 2801 - - - - - - - - - - Button01 - - - - - - - - - - - - - - Button02 - - - - - - - - - - - - - - Button03 - - - - - - - - - - - - - - Button04 - - - - - - - - - - - - - - Button05 - - - - - - - - - - - - - - Button06 - - - - - - - - - - - - - - Button07 - - - - - - - - - - - - - - Button08 - - - - - - - - - - - - - - Button09 - - - - - - - - - - - - - - Button10 - - - - - - - - - - - - - - Button11 - - - - - - - - - - - - - - Button12 - - - - - - - - - - - - - - Button13 - - - - - - - - - - - - - - Button14 - - - - - - - - - - - - - - Button15 - - - - - - - - - - - - - - Button16 - - - - - - - - - - - - - - Button17 - - - - - - - - - - - - - - Button18 - - - - - - - - - - - - - - Button19 - - - - - - - - - - - - - - Button20 - - - - - - + diff --git a/PyUartAssistant/UartDataPolt.py b/PyUartAssistant/UartDataPolt.py index 03e8b85..8444fbd 100644 --- a/PyUartAssistant/UartDataPolt.py +++ b/PyUartAssistant/UartDataPolt.py @@ -9,13 +9,13 @@ Created on Tue May 28 15:40:48 2024 import time,math,os -import re,csv,datetime +import re,csv from PyQt5.QtCore import QThread, pyqtSignal,Qt from PyQt5.QtWidgets import QMessageBox from PyQt5.QtChart import QChart, QValueAxis, QSplineSeries,QLineSeries from PyQt5.QtGui import QPen -from configparser import ConfigParser + # 波形显示 class QChartViewPlot(QChart): @@ -112,7 +112,6 @@ class UpdateDataThread(QThread): super(UpdateDataThread, self).__init__(parent) self.is_exit = False self.x_range = 1024 - self.getDateQx = GetDataQX() self.flag = 0 @@ -169,264 +168,57 @@ class UpdateDataThread(QThread): -class GetDataQX(): #读取请芯数据 - def __init__(self, parent=None): - super().__init__() - self.indOfReturn =0 - self.regexQx = re.compile(r'(A\+|B\+|\s)+') # 编译正则表达式 - self.TIME_FORMAT = "%Y-%m-%d %H:%M:%S" - def Transdata(self,data): - parts = re.split(self.regexQx,data) - # 过滤掉空字符串 - parts = [part for part in parts if part] - #print(parts) - methane = float(parts[1]) - airTemp = float(parts[3]) - laserTemp = float( parts[5])/1 - laerIntensity = float(parts[7])*10 - timeCrvt=time.strftime(self.TIME_FORMAT, time.localtime()) - self.data2csv =[(timeCrvt,methane,airTemp,laserTemp,laerIntensity)] - #print(self.data2csv) - - if self.indOfReturn == 0: - returnData = methane - elif self.indOfReturn == 1: - returnData = airTemp - elif self.indOfReturn == 2: - returnData = laserTemp - elif self.indOfReturn == 3: - returnData = laerIntensity - print(returnData) - return returnData - - def SaveCsv(self,filenameCsv): - # 打开一个文件用于写入,如果文件不存在则创建 - if os.path.isfile(filenameCsv) == 0: - # 文件为空,需要写入表头 - with open(filenameCsv, mode='w', newline='') as file: - writer = csv.writer(file) - writer.writerow(('time', 'Methane', 'Air Temp', 'Laser Temp', 'Laser Intensity')) - else: - with open(filenameCsv, mode='a', newline='') as file: - # 创建一个写入器对象 - writer = csv.writer(file) - # 写入数据行 - writer.writerows(self.data2csv) - - def IndOfReturn(self,ind): - self.indOfReturn = ind - - - - class GetDataTF(): #读取费加罗或者自定义数据 def __init__(self, parent=None): super().__init__() self.indOfReturn =0 - #self.regex = re.compile(r'(A\+|B\+|\s)+') # 编译正则表达式 self.TIME_FORMAT = "%Y-%m-%d %H:%M:%S" - self.regularIniPath = "regular.ini" # 配置文件默认路径 self.headStr = "" self.rowTitle=[] - self.buttons_config = [[None for _ in range(3)] for _ in range(20)] - #存放快捷按键配置 - self.CheckCfgIniData() # 初始化配置文件 + self.csv_buffer = [] + + def SetConfig(self,config_in): + self.regex= re.compile(config_in[0]) #正则表达 + self.headStr = config_in[1] + self.rowTitleStr = config_in[2] + #print(self.rowTitleStr) + self.rowTitle = self.rowTitleStr.split(',') + def Transdata(self,data): if data[:2] ==self.headStr: - # parts = re.split(self.regex,data) - # # 过滤掉空字符串 - # parts = [part for part in parts if part] - #print(parts) - # methane = float(parts[1]) - # airTemp = float(parts[3]) - # laserTemp = float( parts[5])/1 - # laerIntensity = float(parts[7])*10 - - # self.data2csv =[(timeCrvt,methane,airTemp,laserTemp,laerIntensity)] - self.data2csv = self.regex.findall(data) - #print(self.data2csv) - - # if self.indOfReturn == 0: - # returnData = methane - # elif self.indOfReturn == 1: - # returnData = airTemp - # elif self.indOfReturn == 2: - # returnData = laserTemp - # elif self.indOfReturn == 3: - # returnData = laerIntensity returnData = float(self.data2csv[self.indOfReturn]) print("returnData",returnData) return returnData else: return "noNum" - def SaveCsv(self,filenameCsv): + def SaveCsv(self,filenameCsv,num): # 打开一个文件用于写入,如果文件不存在则创建 + # 增加num 写入文件间隔 if os.path.isfile(filenameCsv) == 0: # 文件为空,需要写入表头 - with open(filenameCsv, mode='w', newline='') as file: writer = csv.writer(file) - #writer.writerow(('time', 'Methane', 'Air Temp', 'Laser Temp', 'Laser Intensity')) - writer.writerow(self.rowTitle) else: - with open(filenameCsv, mode='a', newline='') as file: - # 创建一个写入器对象 - writer = csv.writer(file) - # 写入数据行 - timeCrvt=time.strftime(self.TIME_FORMAT, time.localtime()) - self.data2csv.insert(0, timeCrvt) - print(self.data2csv) - writer.writerows([self.data2csv]) - + timeCrvt=time.strftime(self.TIME_FORMAT, time.localtime()) + self.data2csv.insert(0, timeCrvt) + print(self.data2csv) + self.csv_buffer.append(self.data2csv) + if len(self.csv_buffer)>= num: + with open(filenameCsv, mode='a', newline='') as file: + # 创建一个写入器对象 + writer = csv.writer(file) + # 写入数据行 + writer.writerows(self.csv_buffer) + self.csv_buffer.clear() + def IndOfReturn(self,ind): self.indOfReturn = ind - def CheckCfgIniData(self): - if not os.path.exists(self.regularIniPath): - config = ConfigParser() - config.add_section('TF_config') - config.set('TF_config', 'regular', '\+?-?\d+(?:\.\d+)?') - #config.set('TF_config', 'regular', '(A\+|B\+|\s)+') - config.set('TF_config', 'headStr', 'A+') - config.set('TF_config', 'rowTitle', 'time,Methane,Air Temp,Laser Temp,Laser Intensity,amplification,NL,ND,Sinal,SNR,PEAK,Best Piont') - - config.add_section('Quick_config') - config.set('Quick_config', 'Button00', 'write 0,2024100101|序列号') - config.set('Quick_config', 'Button01', 'write 1,65000|激光温度') - config.set('Quick_config', 'Button02', 'write 2,1000|K*1000') - config.set('Quick_config', 'Button03', 'write 3,0|B*1000') - config.set('Quick_config', 'Button04', 'write 4,0|可调电阻') - config.set('Quick_config', 'Button05', 'write 5,30|电阻抽头') - config.set('Quick_config', 'Button06', 'write 6,0|输出温度') - config.set('Quick_config', 'Button07', 'write 7,0|输出激光') - config.set('Quick_config', 'Button08', 'write 8,1|输出状态') - config.set('Quick_config', 'Button09', 'write 9,0|激光温补') - config.set('Quick_config', 'Button10', 'write 10,100|噪声长度') - config.set('Quick_config', 'Button11', 'write 11,600|扫描长度') - config.set('Quick_config', 'Button12', '') - config.set('Quick_config', 'Button13', 'write 13,30500|气温校准') - config.set('Quick_config', 'Button14', 'write 14,1|滑动开关') - config.set('Quick_config', 'Button15', 'write 15,10|滑动标准差') - config.set('Quick_config', 'Button16', 'write 16,1|浓度温补') - config.set('Quick_config', 'Button17', '') - config.set('Quick_config', 'Button18', '') - config.set('Quick_config', 'Button19', '') - with open(self.regularIniPath, 'w' ,encoding='utf-8') as f: - config.write(f) - - config = ConfigParser() - config.read(self.regularIniPath, encoding='utf-8') - try: - self.headStr = config.get('TF_config', 'headStr') - self.regex = re.compile(config.get('TF_config', 'regular')) - self.rowTitleStr = config.get('TF_config', 'rowTitle') - - self.rowTitle = self.rowTitleStr.split(',') - print(type(self.rowTitle)) - print(f"Configuration read successfully: {self.headStr}, {self.regex}, {self.rowTitle}") - - # 创建一个空字典来存储按钮名称和对应的配置 - - - # 循环遍历按钮编号,从0到19 - for i in range(20): - button_name = f'Button{i:02}' # 格式化按钮名称,确保两位数 - # 使用 get 方法安全地获取配置,如果不存在则返回空字符串 - config_value = config.get('Quick_config', button_name, fallback='') - config_value_split = config_value.split('|') - # 将按钮名称和配置信息存储在字典中 - self.buttons_config[i][0] = button_name - if len(config_value_split) == 2: - self.buttons_config[i][1] = config_value_split[0] - self.buttons_config[i][2] = config_value_split[1] - - # 打印字典查看结果 - for i in range(20): - print(f'{self.buttons_config[i][0]}: {self.buttons_config[i][1]}|{self.buttons_config[i][2]}') - - except Exception as e: - print(f"Error reading configuration: {e}") - - def SetCfgIniData(self,button_name,set_text): - config = ConfigParser() - config.read(self.regularIniPath, encoding='utf-8') - config.set('Quick_config', button_name, set_text) - with open(self.regularIniPath, 'w' ,encoding='utf-8') as f: - config.write(f) - - -class GetDataOther(): #读取费加罗或者自定义数据 - def __init__(self, parent=None): - super().__init__() - self.indOfReturn =0 - #self.regex = re.compile(r'(A\+|B\+|\s)+') # 编译正则表达式 - self.TIME_FORMAT = "%Y-%m-%d %H:%M:%S" - self.OtherIniPath = "OtherData.ini" # 配置文件默认路径 - self.headStr = "" - self.rowTitle=[] - self.CheckCfgIniData() # 初始化配置文件 - def Transdata(self,data): - if data[:2] ==self.headStr: - - self.data2csv = self.regex.findall(data) - - returnData = float(self.data2csv[self.indOfReturn]) - print("returnData",returnData) - return returnData - else: - return "noNum" - - def SaveCsv(self,filenameCsv): - # 打开一个文件用于写入,如果文件不存在则创建 - if os.path.isfile(filenameCsv) == 0: - # 文件为空,需要写入表头 - - with open(filenameCsv, mode='w', newline='') as file: - writer = csv.writer(file) - #writer.writerow(('time', 'Methane', 'Air Temp', 'Laser Temp', 'Laser Intensity')) - - writer.writerow(self.rowTitle) - else: - with open(filenameCsv, mode='a', newline='') as file: - # 创建一个写入器对象 - writer = csv.writer(file) - # 写入数据行 - timeCrvt=time.strftime(self.TIME_FORMAT, time.localtime()) - self.data2csv.insert(0, timeCrvt) - print(self.data2csv) - writer.writerows([self.data2csv]) - - def IndOfReturn(self,ind): - self.indOfReturn = ind - - def CheckCfgIniData(self): - if not os.path.exists(self.OtherIniPath): - config = ConfigParser() - config.add_section('OtherData_config') - config.set('OtherData_config', 'regular', '\+?-?\d+(?:\.\d+)?') - # config.set('TF_config', 'regular', '(A\+|B\+|\s)+') - config.set('OtherData_config', 'headStr', 'A+') - config.set('OtherData_config', 'rowTitle', 'time,DATA1,DATA2') - - with open(self.OtherIniPath, 'w') as f: - config.write(f) - - config = ConfigParser() - config.read(self.OtherIniPath, encoding='utf-8') - try: - self.headStr = config.get('OtherData_config', 'headStr') - self.regex = re.compile(config.get('OtherData_config', 'regular')) - self.rowTitleStr = config.get('OtherData_config', 'rowTitle') - self.rowTitle = self.rowTitleStr.split(',') - print(type(self.rowTitle)) - print(f"Configuration read successfully: {self.headStr}, {self.regex}, {self.rowTitle}") - except Exception as e: - print(f"Error reading configuration: {e}")