实验序列编辑器

该代码实现了一个实验浏览器(Browser)应用程序,提供了图形用户界面来管理和运行各种实验。通过使用PyQt6库构建界面,代码实现了实验文件选择、实验队列管理、参数设置和实验执行等功能。

代码概述

该代码实现了一个实验浏览器(Browser)应用程序,提供了图形用户界面来管理和运行各种实验。通过使用PyQt6库构建界面,代码实现了实验文件选择、实验队列管理、参数设置和实验执行等功能。

依赖库

  • osimportlib.utilinspecttracebacknumpyjsondatetime:标准库,用于文件操作、模块加载、错误处理、数值计算和日期时间处理。
  • PyQt6.QtCorePyQt6.QtWidgets:用于构建GUI应用程序。
  • balic.serversbalic.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库构建用户界面。