实验队列管理器
该代码实现了一个实验队列管理器,通过图形用户界面(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())