以下是几个例子,展示了如何将测量结果存储到文件中,进行数据持久化和后续分析。
示例 1:存储数据到 CSV 文件
这个示例演示了如何将测量结果存储到 CSV 文件中,以便后续分析。
示例代码
import sys
import csv
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QTextEdit, QLineEdit
from PyQt5.QtCore import QThread, pyqtSignal
from pymeasure.instruments import Instrument
from pymeasure.instruments.keysight import Keysight34465A
class MeasurementThread(QThread):
result_signal = pyqtSignal(float)
def __init__(self, instrument, duration, interval, output_file, parent=None):
super().__init__(parent)
self.instrument = instrument
self.duration = duration
self.interval = interval
self.output_file = output_file
def run(self):
data = []
end_time = QThread.currentThread().startTime + self.duration * 1000
while QThread.currentThread().startTime < end_time:
value = self.instrument.measure()
data.append(value)
self.result_signal.emit(value)
QThread.msleep(self.interval * 1000)
# 写入CSV文件
with open(self.output_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Time (s)', 'Value'])
for i, value in enumerate(data):
writer.writerow([i * self.interval, value])
self.result_signal.emit(f"数据已存储到 {self.output_file}")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("数据存储到 CSV")
self.setGeometry(100, 100, 600, 400)
self.text_edit = QTextEdit()
self.text_edit.setReadOnly(True)
self.start_button = QPushButton("开始测量")
self.start_button.clicked.connect(self.start_measurement)
self.duration_input = QLineEdit()
self.duration_input.setPlaceholderText("测量持续时间 (秒)")
self.interval_input = QLineEdit()
self.interval_input.setPlaceholderText("数据采样间隔 (秒)")
self.file_input = QLineEdit()
self.file_input.setPlaceholderText("输出文件路径")
layout = QVBoxLayout()
layout.addWidget(self.text_edit)
layout.addWidget(self.duration_input)
layout.addWidget(self.interval_input)
layout.addWidget(self.file_input)
layout.addWidget(self.start_button)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
self.instrument = Keysight34465A("GPIB::24") # 修改为实际地址
def start_measurement(self):
try:
duration = float(self.duration_input.text())
interval = float(self.interval_input.text())
output_file = self.file_input.text()
self.thread = MeasurementThread(self.instrument, duration, interval, output_file)
self.thread.result_signal.connect(self.update_result)
self.thread.start()
except ValueError:
self.text_edit.append("请输入有效的持续时间、间隔时间和文件路径。")
def update_result(self, result):
self.text_edit.append(result)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
示例 2:存储数据到 Excel 文件
使用 pandas 库将测量数据存储到 Excel 文件中,便于进一步分析和处理。
安装依赖
pip install pandas openpyxl
示例代码
import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QTextEdit, QLineEdit
from PyQt5.QtCore import QThread, pyqtSignal
from pymeasure.instruments import Instrument
from pymeasure.instruments.keysight import Keysight34465A
class MeasurementThread(QThread):
result_signal = pyqtSignal(float)
def __init__(self, instrument, duration, interval, output_file, parent=None):
super().__init__(parent)
self.instrument = instrument
self.duration = duration
self.interval = interval
self.output_file = output_file
def run(self):
data = {'Time (s)': [], 'Value': []}
end_time = QThread.currentThread().startTime + self.duration * 1000
while QThread.currentThread().startTime < end_time:
value = self.instrument.measure()
time_point = (QThread.currentThread().startTime - QThread.currentThread().startTime) / 1000
data['Time (s)'].append(time_point)
data['Value'].append(value)
self.result_signal.emit(value)
QThread.msleep(self.interval * 1000)
# 写入Excel文件
df = pd.DataFrame(data)
df.to_excel(self.output_file, index=False)
self.result_signal.emit(f"数据已存储到 {self.output_file}")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("数据存储到 Excel")
self.setGeometry(100, 100, 600, 400)
self.text_edit = QTextEdit()
self.text_edit.setReadOnly(True)
self.start_button = QPushButton("开始测量")
self.start_button.clicked.connect(self.start_measurement)
self.duration_input = QLineEdit()
self.duration_input.setPlaceholderText("测量持续时间 (秒)")
self.interval_input = QLineEdit()
self.interval_input.setPlaceholderText("数据采样间隔 (秒)")
self.file_input = QLineEdit()
self.file_input.setPlaceholderText("输出文件路径")
layout = QVBoxLayout()
layout.addWidget(self.text_edit)
layout.addWidget(self.duration_input)
layout.addWidget(self.interval_input)
layout.addWidget(self.file_input)
layout.addWidget(self.start_button)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
self.instrument = Keysight34465A("GPIB::24") # 修改为实际地址
def start_measurement(self):
try:
duration = float(self.duration_input.text())
interval = float(self.interval_input.text())
output_file = self.file_input.text()
self.thread = MeasurementThread(self.instrument, duration, interval, output_file)
self.thread.result_signal.connect(self.update_result)
self.thread.start()
except ValueError:
self.text_edit.append("请输入有效的持续时间、间隔时间和文件路径。")
def update_result(self, result):
self.text_edit.append(result)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
示例 3:存储数据到 JSON 文件
将测量结果存储到 JSON 文件中,可以用于轻量级的数据交换和存储。
示例代码
import sys
import json
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QTextEdit, QLineEdit
from PyQt5.QtCore import QThread, pyqtSignal
from pymeasure.instruments import Instrument
from pymeasure.instruments.keysight import Keysight34465A
class MeasurementThread(QThread):
result_signal = pyqtSignal(float)
def __init__(self, instrument, duration, interval, output_file, parent=None):
super().__init__(parent)
self.instrument = instrument
self.duration = duration
self.interval = interval
self.output_file = output_file
def run(self):
data = {'Time (s)': [], 'Value': []}
end_time = QThread.currentThread().startTime + self.duration * 1000
while QThread.currentThread().startTime < end_time:
value = self.instrument.measure()
time_point = (QThread.currentThread().startTime - QThread.currentThread().startTime) / 1000
data['Time (s)'].append(time_point)
data['Value'].append(value)
self.result_signal.emit(value)
QThread.msleep(self.interval * 1000)
# 写入JSON文件
with open(self.output_file, 'w') as file:
json.dump(data, file)
self.result_signal.emit(f"数据已存储到 {self.output_file}")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("数据存储到 JSON")
self.setGeometry(100, 100, 600, 400)
self.text_edit = QTextEdit()
self.text_edit.setReadOnly(True)
self.start_button = QPushButton("开始测量")
self.start_button.clicked.connect(self.start_measurement)
self.duration_input = QLineEdit()
self.duration_input.setPlaceholderText("测量持续时间 (秒)")
self.interval_input = QLineEdit()
self.interval_input.setPlaceholderText("数据采样间隔 (秒)")
self.file_input = QLineEdit()
self.file_input.setPlaceholderText("输出文件路径")
layout = QVBoxLayout()
layout.addWidget(self.text_edit)
layout.addWidget(self.duration_input)
layout.addWidget(self.interval_input)
layout.addWidget(self.file_input)
layout.addWidget(self.start_button)
container = QWidget()
container.setLayout(layout
5504

被折叠的 条评论
为什么被折叠?



