微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何防止两个互相更新的小部件出现无限循环?

如何解决如何防止两个互相更新的小部件出现无限循环?

我正在试验 Jupyter Widgets 以查看是否可以制作更好的 this 版本,但显然即使更改不是来自用户,观察处理程序也会触发,因此它创建了一个无限的一个小部件更改另一个小部件的循环。最小示例:

import ipywidgets as widgets

a = widgets.FloatText(description='a:')
b = widgets.FloatText(description='b:')


def on_a_change(change):
    b.value = change['new'] + 1
    
a.observe(on_a_change,names='value')


def on_b_change(change):
    a.value = change['new'] + 1

b.observe(on_b_change,names='value')


display(a)
display(b)

有没有办法只触发用户发起的更改?换句话说,用户更新一个文本框,然后其他文本框也随之更新,但这些更新不会触发更多更新。

解决方法

您也可以在更改值时unobserve一个函数,然后再将其重置。

def on_a_change(change):
    b.unobserve(on_b_change,names='value')
    b.value = change['new'] + 1
    b.observe(on_b_change,names='value')

,

不确定我是否理解要求,但如果是“多更新一个”,那么您可以尝试以下操作

import ipywidgets as widgets

a = widgets.FloatText(description='a:')
b = widgets.FloatText(description='b:')

def update_one(x):
    return x + 1

widgets.link((a,'value'),(b,(update_one,update_one))

display(a)
display(b)

widgets.link 似乎可以解决问题,如果你执行 widgets.link.__doc__ 你可以看到文档并且它接受第三个参数。

>>> print(widgets.link.__doc__)
Link traits from different objects together so they remain in sync.

    Parameters
    ----------
    source : (object / attribute name) pair
    target : (object / attribute name) pair
    transform: iterable with two callables (optional)
        Data transformation between source and target and target and source.

所以我添加了一个可调用的可迭代对象,并使其返回的值比您输入的值多 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。