Сохранять состояние объекта виджета в экземпляре объекта ядра ipython, а не в классе объекта - PullRequest
0 голосов
/ 06 марта 2019

Следуя учебнику с сохранением состояния , мы можем создать простой DOM-виджет. Вот код Python:

import ipywidgets.widgets as widgets
from traitlets import Unicode

class HelloWidget(widgets.DOMWidget):
    _view_name = Unicode('HelloView').tag(sync=True)
    _view_module = Unicode('hello').tag(sync=True)
    _view_module_version = Unicode('0.1.0').tag(sync=True)
    value = Unicode('Hello World!').tag(sync=True)

И код JavaScript:

%%javascript
require.undef('hello');

define('hello', ["@jupyter-widgets/base"], function(widgets) {

    var HelloView = widgets.DOMWidgetView.extend({

        render: function() {
            this.el.textContent = this.model.get('value');
        },
    });

    return {
        HelloView : HelloView
    };
});

Это работает так, как указано в блокноте:

In [1]: HelloWidget()
Out [1]: Hello World!

Теперь, если я хочу сохранить состояние виджета value в экземпляре объекта, я могу изменить код Python так, чтобы он выглядел следующим образом:

import ipywidgets.widgets as widgets
from traitlets import Unicode

class HelloWidget(widgets.DOMWidget):
    _view_name = Unicode('HelloView').tag(sync=True)
    _view_module = Unicode('hello').tag(sync=True)
    _view_module_version = Unicode('0.1.0').tag(sync=True)
    def __init__(self, s):
        super().__init__()
        self.value = Unicode(s).tag(sync=True)

Однако это не работает; состояние не отображается в выходной ячейке, как ожидалось (без вывода):

In [1]: HelloWidget("Hello World!")
Out [1]: 

Как это можно сделать?

1 Ответ

0 голосов
/ 07 марта 2019

Я понял это (и чувствую себя немного глупым).

Объект trailets.Unicode является дескриптором, поэтому его необходимо присоединить к объекту класса, HelloWidget. Итак, правильный код выглядит следующим образом:

import ipywidgets.widgets as widgets
from traitlets import Unicode

class HelloWidget(widgets.DOMWidget):
    _view_name = Unicode('HelloView').tag(sync=True)
    _view_module = Unicode('hello').tag(sync=True)
    _view_module_version = Unicode('0.1.0').tag(sync=True)
    value = Unicode().tag(sync=True) # value is set to an empty string as placeholder

    def __init__(self, s):
        super().__init__()
        self.value = s # initialize with a value here
...