使用小部件 (ipywidgets) 中断 widget1_handler

Interupt widget1_handler using widget2 (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]))

我想做的是通过单击 b 打破单击 a 时启动的 for 循环。上面的代码不起作用,我似乎无法在其他地方找到类似的 problem/solution 。即使单击 bb.value 似乎也没有为 for 循环更新。

有什么我想念的吗?还有另一种解决方法吗?感谢您的帮助!

改编自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]))