实验序列编辑器
CodeEditor、ExperimentSequencer 和 ExperimentParser,以及一个主窗口类 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:文件名(未使用)- 订阅
Properties的Sequencer属性 - 创建
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提供的窗口和控件,用户可以方便地编辑实验代码,并实时查看实验序列的变化。