如何在 python 对象和 ipywidget 之间双向 link

how to two-way link between a python object and an ipywidget

亲爱的 ipywidgets 大师,

我想在一些 python 对象的属性和一些 ipywidget 的值之间设置一个 link:

import ipywidgets as ipyw

w = ipyw.IntSlider(42)

class Foo(object):
    def __init__(self, i=0):
        self.i = i  # not a traitlet, just an integer
foo = Foo(w.value)

two_way_link((w, 'value'), (foo, 'i'))  # mimics ipyw.link()

foo.i = 5  # will move the slider of w
w.value = 8  # update foo.i

我想到 two_way_link 在 foo.i 周围实例化一个包装器 traitlet,然后将 ipyw.link 与此包装器和 w.value 一起使用。也许有人可以建议和替代方法?

普通 python 属性(Foo.i,此处)不提供任何开箱即用的 signals/events,因此没有任何现成的方法可以做到这一点。通过观察 traitlet 并让处理程序设置属性(ipywidget.dlink 可能已经支持这个,不确定),从 traitlet 到属性的一种方式 link 是可能的。有一些事情是相反的,你可能会在 Foo (https://docs.python.org/2/reference/datamodel.html#object.setattr).

上使用 __setattr__ 方法运气好