实验序列编辑器

该代码实现了一个图形用户界面(GUI)应用程序,用于编辑和可视化实验序列。应用程序使用了PyQt6库来创建界面,Qsci库提供代码编辑器,pyqtgraph库用于绘图。代码主要包括三个类:CodeEditorExperimentSequencerExperimentParser,以及一个主窗口类 CodeEditorParser

类和方法

CodeEditor

CodeEditor 继承自 QsciScintilla,实现了一个简单的代码编辑器,具有语法高亮和自动补全功能。

方法:

  • __init__(self, parent=None, filename=None):初始化编辑器,设置字体、缩进、自动补全和行号。

    • parent:父窗口
    • filename:要加载的文件名
    • 设置最小尺寸为800x600
    • 设置编辑器字体为Courier New,字号12,固定间距
    • 设置缩进宽度为4,不使用制表符缩进,启用自动缩进
    • 启用自动补全,触发阈值为3个字符
    • 设置边距宽度以显示行号
    • 如果提供了文件名,则加载文件内容到编辑器中
  • saveFile(self):保存当前文本到文件。

    • 如果提供了文件名,则将编辑器中的文本写入文件
    • 如果保存成功,打印"file saved successfully"
    • 如果保存失败,打印错误信息
    • 如果文件名无效,打印"filename is invalid, failed to save file"

ExperimentSequencer

ExperimentSequencer 继承自 QtWidgets.QWidget,用于可视化实验序列。

方法:

  • __init__(self, parent=None, filename=None):初始化窗口,订阅属性并创建绘图窗口。

    • parent:父窗口
    • filename:文件名(未使用)
    • 订阅PropertiesSequencer属性
    • 创建GraphicsLayoutWidget并设置背景为白色
    • 将绘图窗口添加到网格布局中
  • plotSequence(self, sequence):绘制实验序列,输入格式由 ExperimentParser 定义。

    • sequence:包含实验序列的字典,键为通道名,值为包含时间和状态的子字典
    • 重置绘图窗口
    • 矢量化布尔值到整数的转换
    • 找到全局最小和最大时间
    • 处理开始和结束时未定义的值
    • 准备颜色
    • 为每个通道创建线图,根据通道名选择颜色
    • 将所有图的X轴链接到第一个图

ExperimentParser

ExperimentParser 用于解析实验代码,模拟实验运行并输出包含通道、时间和通道状态的表。

方法:

  • __init__(self, filename=None):初始化解析器,构建实验。

    • filename:文件名
    • 调用buildExperiment方法构建实验
  • buildExperiment(self):构建实验,使其在 self.filename 中可访问。

    • 动态导入模块并获取实验类
    • 模拟实验命令堆栈
  • simulateExperiment(self):模拟实验运行,返回指令堆栈,并按通道组织为字典。

    • 运行实验,获取模拟的命令堆栈
    • 将命令堆栈转移到字典中,键为通道名,值为包含时间和状态的子字典

CodeEditorParser

CodeEditorParser 继承自 QtWidgets.QMainWindow,将代码编辑器、解析器和实验代码的可视化结合在一起。

方法:

  • __init__(self, parent=None, filename=None):初始化主窗口,创建停靠窗口和按钮。

    • parent:父窗口
    • filename:文件名
    • 设置窗口标题为“Experiment Editor”
    • 设置窗口几何尺寸为1280x800
    • 创建停靠窗口和按钮
    • 初始化时模拟实验序列并绘制
  • addButtons(self):添加保存和模拟按钮。

    • 创建保存和模拟按钮
    • 将按钮添加到布局中
    • 连接按钮点击事件到相应的方法
  • createDocks(self):创建停靠区,包含左侧的 CodeEditor 和右侧的 ExperimentSequencer

    • 创建CodeEditor实例并添加到左侧停靠区
    • 创建ExperimentSequencer实例并添加到右侧停靠区
  • simulateExperiment(self):模拟当前版本的实验,将指令堆栈传递给 ExperimentSequencer 进行可视化。

    • 保存文件,重建实验并模拟运行
    • 将模拟的指令堆栈传递给ExperimentSequencer进行绘制

main() 函数

  • 创建 QApplication 实例。
  • 创建 CodeEditorParser 实例并显示。
  • 启动应用程序的主循环。
def main():
    app = QtWidgets.QApplication(sys.argv)
    Win = CodeEditorParser(filename=sys.argv[1])
    Win.show()
    sys.exit(app.exec())

代码执行

代码通过命令行执行,接收一个文件名作为参数:

python script.py your_experiment_file.py

总结

该代码实现了一个集成代码编辑、实验序列解析和可视化的GUI工具。通过PyQt6提供的窗口和控件,用户可以方便地编辑实验代码,并实时查看实验序列的变化。