<jupyter_start><jupyter_text>At first changing the value of one will not affect the other<jupyter_code>w2.value2 = "won't change both :("<jupyter_output><empty_output><jupyter_text>But if we use ipywidgets.jslink ([ref](https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.htmlLinking-widgets-attributes-from-the-client-side)) then the I always thought that jslink was only for the official widgets but it turns out it's general which is awesomenot sure if there is much useful to do with the returned link object<jupyter_code>from ipywidgets import jslink, jsdlink
link = jslink((w1,'value1'), (w2, 'value2'))
# now both will update
w2.value2='yikes!'<jupyter_output><empty_output><jupyter_text>Now with a directional change<jupyter_code>w1 = jslink_custom_widgets.widget1()
w2 = jslink_custom_widgets.widget2()

display(w1)
display(w2)
link = jsdlink((w1,'value1'), (w2, 'value2'))
w1.value1 = 'yikes'
w2.value2 = 'not reciprocated'<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11530612244897959, 'fraction_numerical': 0.024489795918367346, 'mean_word_length': 7.313559322033898, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '462002', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 364, 'n_tokens_neox': 349, 'n_words': 87, 'path': 'jslink-custom-widgets/examples/jslink-examples.ipynb', 'repo_name': 'jtpio/custom-ipywidget-howto', 'size': '980'}