我尝试通过一个简单的复选框启动和停止while循环。但是我不知道如何在while循环中更新复选框状态。
在下面您可以看到我所拥有的,但是当我取消选中该框时,while循环将无法识别它。
我搜索了交互式功能,但未找到任何功能来获取复选框的更新状态。
希望你们能帮助我:)
import ipywidgets
import time
def f(x):
while x==True:
print("!")
time.sleep(1)
c=ipywidgets.interactive(f,x=False)
c
答案 0 :(得分:0)
如果您通过以下方式显式创建复选框:
checkbox = widgets.Checkbox(description='click me')
...您可以使用checkbox.value
获取当前值。
令人讨厌的是,仅允许您的复选框停止while循环的执行还不够。一旦while循环开始,它将占用Python解释器。因此,在while循环结束之前,没有任何空间可以解释复选框的更改。
由于这从根本上讲是一个并发问题(您希望在运行计算的同时对复选框的更改做出反应),因此需要使用Python的并发原语。例如,您可以使用coroutines来实现:
import ipywidgets as widgets
import asyncio
class HaltableExecutor:
def __init__(self, checkbox):
self._checkbox = checkbox
async def my_code(self):
# This is your user code
while True:
if self._checkbox.value:
print('running') # put your code here
await asyncio.sleep(0.1) # use this to temporarily give up control of the event loop to allow scheduling checkbox changes
def start(self):
print('starting')
asyncio.ensure_future(self.my_code())
然后,创建并显示您的复选框:
c = widgets.Checkbox(description='click me')
c
...然后启动执行程序:
exe = HaltableExecutor(c)
exe.start()
while循环现在将运行。在每次迭代中,我们都会暂停以asyncio.sleep
放弃对事件循环的控制。我们所睡的数量无关紧要,关键是要控制自己。这为主线程提供了处理复选框更改等未完成消息的机会。在while循环的下一次迭代中,再次检查self._checkbox.value
,依此类推。