代码之家  ›  专栏  ›  技术社区  ›  Rick SilentGhost

将小部件对象状态存储到ipython内核对象实例,而不是对象类

  •  0
  • Rick SilentGhost  · 技术社区  · 5 年前

    遵循 stateful widget tutorial ,我们可以创建一个简单的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]: 
    

    如何做到这一点?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Rick SilentGhost    5 年前

    我明白了(觉得有点傻)。

    这个 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