使用widget2(ipywidgets)交互widget1_handler

时间:2019-02-28 00:03:38

标签: python jupyter-notebook ipywidgets

以下代码段旨在代表我正在研究的问题:

import ipywidgets as widgets
from IPython.display import display

a = widgets.ToggleButton(
    value=False,
    description='start',
    disabled=False,
    icon=''
)

b = widgets.ToggleButton(
    value=False,
    description='stop',
    disabled=True,
    icon=''
)

def func1(change):
    if change['new'] is True:
        a.disabled = True
        b.disabled = False
        for i in range(1000000):
            if b.value is False:
                print(i)
            elif b.value is True:
                break

a.observe(func1, 'value')

display(widgets.VBox([a, b]))

我想做的是通过单击a来打破单击b后启动的for循环。上面的代码不起作用,在其他地方我似乎找不到类似的问题/解决方案。即使单击b.value,似乎b的for循环也没有更新。

有什么我想念的吗?还有其他解决方法吗?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

改编自here。您将需要使用一个线程,以便在运行一个循环时更改其他小部件。

import ipywidgets as widgets
from IPython.display import display
import time

a = widgets.ToggleButton(
    value=False,
    description='start',
    disabled=False,
    icon=''
)

b = widgets.ToggleButton(
    value=False,
    description='stop',
    disabled=True,
    icon=''
)

def work():
    a.disabled = True
    b.disabled = False
    for i in range(1000000):
        time.sleep(1)
        if b.value is False:
            print(i)
        elif b.value is True:
            break

def func1(change):
    if change['new'] is True:
        thread = threading.Thread(target=work)
        thread.start()

a.observe(func1, 'value')

display(widgets.VBox([a, b]))