优化了界面显示

This commit is contained in:
wangxibao 2025-01-25 11:13:39 +08:00
parent f86b9f0a65
commit 46e7114e95
7 changed files with 297 additions and 877 deletions

Binary file not shown.

View File

@ -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)

View File

@ -4,5 +4,6 @@ port = 9000
bytes_start = 3
bytes_length = 4
num_scale = 1000
log_time= 10
log_time = 1
window_title = Hex数据解调工具

View File

@ -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接收与保存csvhex下不保存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)

View File

@ -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

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>996</width>
<width>999</width>
<height>694</height>
</rect>
</property>
@ -670,7 +670,7 @@
<bool>false</bool>
</property>
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
@ -1049,7 +1049,7 @@
<x>0</x>
<y>0</y>
<width>241</width>
<height>1000</height>
<height>3000</height>
</rect>
</property>
<widget class="QWidget" name="widget_8" native="true">
@ -1072,7 +1072,7 @@
<item>
<widget class="QCheckBox" name="checkBox_return">
<property name="text">
<string>添加&quot;回车换行&quot;</string>
<string>添加&quot;\r\n&quot;</string>
</property>
<property name="checked">
<bool>true</bool>
@ -1086,8 +1086,8 @@
<rect>
<x>12</x>
<y>42</y>
<width>236</width>
<height>1000</height>
<width>231</width>
<height>3000</height>
</rect>
</property>
<widget class="QWidget" name="layoutWidget">
@ -1095,292 +1095,11 @@
<rect>
<x>12</x>
<y>12</y>
<width>218</width>
<height>616</height>
<width>201</width>
<height>2801</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_1">
<item>
<widget class="QLineEdit" name="lineEditQuick_1"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_1">
<property name="text">
<string>Button01</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_2">
<item>
<widget class="QLineEdit" name="lineEditQuick_2"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_2">
<property name="text">
<string>Button02</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_3">
<item>
<widget class="QLineEdit" name="lineEditQuick_3"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_3">
<property name="text">
<string>Button03</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_4">
<item>
<widget class="QLineEdit" name="lineEditQuick_4"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_4">
<property name="text">
<string>Button04</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_5">
<item>
<widget class="QLineEdit" name="lineEditQuick_5"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_5">
<property name="text">
<string>Button05</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_6">
<item>
<widget class="QLineEdit" name="lineEditQuick_6"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_6">
<property name="text">
<string>Button06</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_7">
<item>
<widget class="QLineEdit" name="lineEditQuick_7"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_7">
<property name="text">
<string>Button07</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_8">
<item>
<widget class="QLineEdit" name="lineEditQuick_8"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_8">
<property name="text">
<string>Button08</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_9">
<item>
<widget class="QLineEdit" name="lineEditQuick_9"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_9">
<property name="text">
<string>Button09</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_10">
<item>
<widget class="QLineEdit" name="lineEditQuick_10"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_10">
<property name="text">
<string>Button10</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_11">
<item>
<widget class="QLineEdit" name="lineEditQuick_11"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_11">
<property name="text">
<string>Button11</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_12">
<item>
<widget class="QLineEdit" name="lineEditQuick_12"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_12">
<property name="text">
<string>Button12</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_13">
<item>
<widget class="QLineEdit" name="lineEditQuick_13"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_13">
<property name="text">
<string>Button13</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_14">
<item>
<widget class="QLineEdit" name="lineEditQuick_14"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_14">
<property name="text">
<string>Button14</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_15">
<item>
<widget class="QLineEdit" name="lineEditQuick_15"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_15">
<property name="text">
<string>Button15</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_16">
<item>
<widget class="QLineEdit" name="lineEditQuick_16"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_16">
<property name="text">
<string>Button16</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_17">
<item>
<widget class="QLineEdit" name="lineEditQuick_17"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_17">
<property name="text">
<string>Button17</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_18">
<item>
<widget class="QLineEdit" name="lineEditQuick_18"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_18">
<property name="text">
<string>Button18</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_19">
<item>
<widget class="QLineEdit" name="lineEditQuick_19"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_19">
<property name="text">
<string>Button19</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayoutQuick_20">
<item>
<widget class="QLineEdit" name="lineEditQuick_20"/>
</item>
<item>
<widget class="QPushButton" name="pushButtonQuick_20">
<property name="text">
<string>Button20</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<layout class="QVBoxLayout" name="verticalLayout_8"/>
</widget>
</widget>
</widget>

View File

@ -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}")