实验序列编辑器
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提供的窗口和控件,用户可以方便地编辑实验代码,并实时查看实验序列的变化。