带iPyWidget的互连滑块

2024-09-26 22:44:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在Jupyter笔记本中,我想让三个滑块有一个常数和,其中一个滑块的值的变化通过生成随机数触发另两个滑块的变化。我目前的做法如下:

import ipywidgets as widgets
import numpy as np
from IPython.display import display

y = widgets.FloatSlider(min=0, max=100, step=1, description="Yes")
n = widgets.FloatSlider(min=0, max=100, step=1, description="No")
a = widgets.FloatSlider(min=0, max=100, step=1, description="Abstention")
output = widgets.Output()

@output.capture()
def slider_y_eventhandler(change):
    output.clear_output()
    n.value = np.random.randint(0, 100 - change["new"])
    a.value = 100 - sum([change["new"], n.value])
    with output:
        if sum([n.value, change["new"]]) >= 100:
            logger.debug()
        print(sum((y.value, n.value, a.value)))


@output.capture()
def slider_n_eventhandler(change):
    output.clear_output()
    y.value = np.random.randint(0, 100 - change["new"])
    a.value = 100 - sum([change["new"], n.value])
    with output:
        logger.debug(change["owner"])
        print(sum((y.value, n.value, a.value)))


@output.capture()
def slider_a_eventhandler(change):
    output.clear_output()
    y.value = np.random.randint(0, 100 - change["new"])
    n.value = 100 - sum([change["new"], a.value])
    with output:
        logger.debug(change["owner"])
        print(sum((y.value, n.value, a.value)))


y.observe(slider_y_eventhandler, names="value")
n.observe(slider_n_eventhandler, names="value")
a.observe(slider_a_eventhandler, names="value")

display(y, n, a, output)

问题是,通过更改slidera的值,内核会不断重复其他两个slider的更改,直到崩溃。有什么办法可以防止吗?或者我用错误的方式处理这个问题


Tags: importnewoutputvaluedisplaynpwidgetsmin

热门问题