仪器仪表控制:pymeasure结合PYQT的用例2

以下是几个例子,展示了如何将测量结果存储到文件中,进行数据持久化和后续分析。

示例 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT-Power

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值