实验队列管理器

该代码实现了一个实验队列管理器,通过图形用户界面(GUI)来显示和控制实验任务队列。使用PyQt6库来构建界面,其中包含按钮和表格,用于管理实验任务。代码主要包括一个类:ExperimentQ

类和方法

ExperimentQ

ExperimentQ 继承自 QGroupBox,实现了一个实验队列管理器,显示和控制实验任务队列。

方法:

  • __init__(self, browser, parent=None, title="Experiment Queue"):初始化实验队列管理器。

    • browser:浏览器对象,用于访问属性和实验管理器
    • parent:父窗口
    • title:组框标题,默认为"Experiment Queue"
    • 创建按钮和表格,并设置布局
    • 初始化属性
    • 设置锁定标志为False
  • create_buttons(self):创建并配置控制按钮。

    • 创建暂停按钮、终止按钮、终止所有按钮和重启按钮
    • 设置按钮图标、提示信息和点击事件处理函数
  • init_table_actions(self):初始化表格操作。

    • 创建删除、终止、终止所有、休眠和暂停操作
    • 设置操作的快捷键和上下文
    • 将操作添加到表格
  • init_table(self):初始化表格。

    • 创建 QTableView 并设置选择行为、选择模式和上下文菜单策略
    • 隐藏垂直表头并设置其调整模式为内容适应
    • 初始化 expDict 为一个空字典
    • 创建 ScheduleModel 并将其设置为表格模型
    • 设置水平表头的调整模式
  • set_model(self, model):设置表格的新模型。

    • model:新的模型对象
    • 将模型设置为表格模型
  • delete_clicked(self):从队列中删除任务,或者如果任务正在运行则优雅地终止。

    • 获取选中的行,并获取对应的任务编号
    • 如果任务状态为“Running”或“Scanning”,则标记任务为终止
    • 否则,从模型中删除任务
    • 设置当前索引为选中的行
  • terminate_clicked(self):优雅地终止选中的任务(允许完成运行)。

    • 获取选中的行,并获取对应的任务编号
    • 标记任务为终止,状态设置为“Termination Pending”
    • 如果没有选中任务,且模型中有任务,则终止第一个任务
  • terminate_all(self):终止所有任务。

    • 遍历所有任务,标记为终止,状态设置为“Termination Pending”
  • set_sleeping(self):将选中的任务设置为“Sleeping”状态,或者取消“Sleeping”状态。

    • 获取选中的行,并获取对应的任务编号
    • 如果任务状态为“Sleeping”,则设置为“Queued”,否则设置为“Sleeping”
  • pause(self):暂停当前运行的实验。

    • 调用浏览器的实验管理器的暂停方法
    • 根据实验管理器的暂停状态,切换暂停按钮的图标
  • update_item(self, k, v):更新表格中的项目。

    • k:键(任务编号)
    • v:值(任务信息)
    • 将任务信息更新到模型中,并解锁
  • delete_item(self, k):删除表格中的项目。

    • k:键(任务编号)
    • 从模型中删除任务,并解锁
  • restart(self):用于测试按钮的功能。

    • 设置属性值并进行各种操作,打印结果

代码执行

该代码通过创建 ExperimentQ 对象,并将其嵌入到主窗口中来执行。主窗口中会包含实验队列的表格和控制按钮,用户可以通过这些按钮来控制实验任务的状态。

# 示例代码,展示如何创建并显示 ExperimentQ 对象
if __name__ == "__main__":
    import sys
    from PyQt6.QtWidgets import QApplication, QMainWindow

    app = QApplication(sys.argv)
    mainWindow = QMainWindow()
    browser = ...  # 创建或获取浏览器对象
    experimentQueue = ExperimentQ(browser)
    mainWindow.setCentralWidget(experimentQueue)
    mainWindow.show()
    sys.exit(app.exec())