Hello World Custom Widget Example.
This example was bootstrapped from the Jupyter TypeScript Cookiecutter and follows the same structure.
The widget code running on the Python kernel is mostly self-contained in the example.py
file:
# hello_world/example.py#L16-L26
class ExampleWidget(DOMWidget):
"""TODO: Add docstring here
"""
_model_name = Unicode('ExampleModel').tag(sync=True)
_model_module = Unicode(module_name).tag(sync=True)
_model_module_version = Unicode(module_version).tag(sync=True)
_view_name = Unicode('ExampleView').tag(sync=True)
_view_module = Unicode(module_name).tag(sync=True)
_view_module_version = Unicode(module_version).tag(sync=True)
value = Unicode('Hello World').tag(sync=True)
On the front end, we define the model for the widget:
// src/widget.ts#L15-L40
export class ExampleModel extends DOMWidgetModel {
defaults() {
return {
...super.defaults(),
_model_name: ExampleModel.model_name,
_model_module: ExampleModel.model_module,
_model_module_version: ExampleModel.model_module_version,
_view_name: ExampleModel.view_name,
_view_module: ExampleModel.view_module,
_view_module_version: ExampleModel.view_module_version,
value: 'Hello World',
};
}
static serializers: ISerializers = {
...DOMWidgetModel.serializers,
// Add any extra serializers here
};
static model_name = 'ExampleModel';
static model_module = MODULE_NAME;
static model_module_version = MODULE_VERSION;
static view_name = 'ExampleView'; // Set to null if no view
static view_module = MODULE_NAME; // Set to null if no view
static view_module_version = MODULE_VERSION;
}
And the view for the widget:
// src/widget.ts#L42-L53
export class ExampleView extends DOMWidgetView {
render() {
this.el.classList.add('custom-widget');
this.value_changed();
this.model.on('change:value', this.value_changed, this);
}
value_changed() {
this.el.textContent = this.model.get('value');
}
}