以下代码段旨在代表我正在研究的问题:
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循环也没有更新。
有什么我想念的吗?还有其他解决方法吗?任何帮助表示赞赏!
答案 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]))