实验序列编辑器
该代码实现了一个实验浏览器(
Browser
)应用程序,提供了图形用户界面来管理和运行各种实验。通过使用PyQt6库构建界面,代码实现了实验文件选择、实验队列管理、参数设置和实验执行等功能。代码概述
该代码实现了一个实验浏览器(Browser
)应用程序,提供了图形用户界面来管理和运行各种实验。通过使用PyQt6库构建界面,代码实现了实验文件选择、实验队列管理、参数设置和实验执行等功能。
依赖库
os
、importlib.util
、inspect
、traceback
、numpy
、json
、datetime
:标准库,用于文件操作、模块加载、错误处理、数值计算和日期时间处理。PyQt6.QtCore
和PyQt6.QtWidgets
:用于构建GUI应用程序。balic.servers
和balic.GUI
:自定义库,用于属性管理和GUI组件。
类和方法
Browser
类
Browser
继承自 QMainWindow
,实现了实验浏览器的主界面。
信号:
experimentOpened
:实验打开信号。
方法:
__init__(self)
:初始化浏览器,设置属性、任务队列和其他组件,并恢复窗口几何设置。closeEvent(self, event)
:处理窗口关闭事件,调用父类的关闭事件处理方法。init_ui(self)
:初始化用户界面,设置状态栏和中央窗口区域,并创建停靠窗口。create_dock_widgets(self)
:创建停靠窗口,包含文件选择器、实验队列、准备站和循环器。open_experiment(self, filepath, startup=False)
:打开一个新的实验窗口,如果实验已经打开,则不执行任何操作。update_exp_window_task(self)
:更新所有实验窗口中的任务号。
ExperimentSubWindow
类
ExperimentSubWindow
继承自 QMdiSubWindow
,实现了实验窗口的容器。
方法:
__init__(self, name, props, parent=None)
:初始化子窗口,设置窗口标题和属性。store_geometry(self)
:存储窗口几何设置。
ExperimentWindow
类
ExperimentWindow
继承自 QWidget
,实现了单个实验的控制,包括参数设置和任务提交。
方法:
__init__(self, filepath, props, parent=None, browser=None)
:初始化实验窗口,加载实验文件并构建用户界面。init_ui(self)
:初始化用户界面,创建控件和布局。save_params(self, backup=False)
:保存实验参数到JSON文件。load_params(self)
:从JSON文件加载实验参数。get_files(self)
:打开文件选择对话框,获取文件路径。update_task_qsb(self)
:更新任务号选择框。submit_to_queue(self)
:提交实验到实验队列。submit_next(self)
:提交实验到实验队列,并设置最高优先级。submit_to_prepper(self)
:提交实验到准备站。setup_scan(self)
:设置扫描序列。setup_task_dict(self)
:创建任务字典,存储实验参数。build_argument_dict(self)
:创建实验参数字典。edit_sequence(self)
:打开序列编辑器窗口。closeEvent(self, event)
:处理窗口关闭事件,移除打开的窗口。gui_columns(self)
:返回GUI列数。arguments(self)
:返回实验参数。argument_names(self)
:返回实验参数名称列表。argument_dicts(self)
:返回实验参数字典列表。store_geometry(self)
:存储窗口几何设置。
SequenceEditor
类
SequenceEditor
继承自 QDialog
,实现了序列编辑器窗口。
方法:
__init__(self, experimentWindow, parent=None)
:初始化序列编辑器窗口,设置窗口标题和图标,并创建控件和布局。update_parameter(self, parname, n)
:根据参数名称更新参数的范围和步长。update_list_generator(self)
:更新列表生成器。update_values(self)
:更新序列编辑器中的值。
QDock
类
QDock
继承自 QDockWidget
,实现了包含实验队列、准备站和循环器的停靠窗口。
方法:
__init__(self, parent=None)
:初始化停靠窗口,设置布局和子控件。
FileSelector
类
FileSelector
继承自 QWidget
,实现了实验文件选择器。
方法:
__init__(self, browser, parent=None)
:初始化文件选择器,设置属性和布局,并创建文件树视图。file_model(self, directory)
:创建文件模型,用于显示目录中的文件和文件夹。set_column_widths(self)
:设置文件树视图的列宽。go_up(self)
:导航到上一级目录。create_context_menu(self, position)
:创建上下文菜单,提供编辑和组合编辑选项。open_editor(self, filename)
:打开代码编辑器。open_file(self)
:打开文件或目录。
辅助函数
filepath_split(filepath)
拆分文件路径,返回路径、扩展名、名称和文件名。
def filepath_split(filepath):
"""
takes /dir/name.ext
returns path, ext, name, filename
= /dir/name, ext, name, name.ext
"""
path, ext = os.path.splitext(filepath) # /dir/name, ext
name = os.path.basename(path) # name
filename = os.path.basename(filepath) # name.ext
return path, ext, name, filename
主函数
初始化应用程序并启动主窗口。
def main():
qApp = QApplication(sys.argv)
Win = Browser()
qApp.setWindowIcon(QIcon(iconpath + '/browser.png'))
Win.show()
sys._excepthook = sys.excepthook
sys.excepthook = exception_hook
sys.exit(qApp.exec())
def exception_hook(exctype, value, traceback):
send_error('[Browser] ' + str([exctype, value, traceback]))
sys._excepthook(exctype, value, traceback)
sys.exit(1)
# Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
send_info('[Browser] BaLi Browser starts')
if (sys.flags.interactive != 1) or not hasattr(Qt, 'PYQT_VERSION'):
main()
总结
该代码实现了一个实验浏览器应用程序,通过图形用户界面管理和运行各种实验。它提供了实验文件选择、实验队列管理、参数设置和实验执行等功能,并使用PyQt6库构建用户界面。