You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JupyterLab 3.2.0自定义扩展中监听Notebook单元格事件

JupyterLab 3.2.0 自定义扩展监听Notebook单元格事件实现方案

你之前找到的代码均为经典Jupyter Notebook的扩展写法,不适用于JupyterLab 3.x版本。针对你的疑问先给出明确结论:

JupyterLab 3.x 确实已经废弃了经典Jupyter Notebook的全局事件注册表机制,所有事件都以*信号(Signal)*的形式挂载在对应模型、组件实例上,需要先获取到Notebook实例再绑定监听,不存在全局可直接访问的事件对象。

前置依赖

扩展开发时需要先安装对应的依赖包:
npm install @jupyterlab/notebook @lumino/signaling

常见单元格事件监听实现

1. 监听单元格列表变化(新增、删除、移动单元格)

import { INotebookTracker } from '@jupyterlab/notebook';
import { each } from '@lumino/algorithm';
import { ISignal, Signal } from '@lumino/signaling';

// 扩展激活函数中获取NotebookTracker实例
const activate = (app, notebookTracker: INotebookTracker) => {
  // 监听所有已打开的Notebook实例
  notebookTracker.widgetAdded.connect((tracker, panel) => {
    // 绑定当前Notebook的单元格列表变化信号
    panel.notebook.model.cells.changed.connect((cellList, changed) => {
      // changed.type 可选值: 'add' | 'remove' | 'set' | 'move'
      if (changed.type === 'add') {
        // 遍历新增的单元格模型
        each(changed.newValues, cellModel => {
          // 匹配对应的单元格组件实例
          const cellWidget = panel.notebook.widgets.find(w => w.model.id === cellModel.id);
          // 此处写新增单元格后的处理逻辑
          console.log('新增单元格:', cellWidget);
        });
      }
      if (changed.type === 'remove') {
        each(changed.oldValues, cellModel => {
          console.log('删除单元格:', cellModel.id);
        });
      }
    });
  });
};

2. 监听单元格执行、内容修改、选中事件

在上述代码中获取到cellWidget单元格组件实例后,可以绑定更多常用事件:

// 监听单元格执行状态变更
cellWidget.model.stateChanged.connect((model, change) => {
  // 判断是否是执行状态变更
  if (change.name === 'executionCount') {
    if (model.executionCount !== null) {
      console.log('单元格开始执行', model.id);
    } else {
      console.log('单元格执行完成/重置', model.id);
    }
  }
});

// 监听单元格内容变更
cellWidget.model.contentChanged.connect(() => {
  console.log('单元格内容更新:', cellWidget.model.sharedModel.getSource());
});

// 监听单元格选中状态变化
cellWidget.stateChanged.connect((widget, state) => {
  if (state.name === 'selected') {
    console.log('单元格选中状态变更:', state.newValue);
  }
});

注意事项

所有绑定的信号需要在组件销毁时手动断开,避免内存泄漏:

// 断开信号连接示例
Signal.disconnectAll(panel.notebook.model.cells.changed);

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:09:02