如何使用ipywidget交互式复选框启动和停止while循环?

时间:2019-06-12 11:18:52

标签: python python-3.x checkbox interactive ipywidgets

我尝试通过一个简单的复选框启动和停止while循环。但是我不知道如何在while循环中更新复选框状态。

在下面您可以看到我所拥有的,但是当我取消选中该框时,while循环将无法识别它。

我搜索了交互式功能,但未找到任何功能来获取复选框的更新状态。

希望你们能帮助我:)

import ipywidgets
import time

def f(x):
    while x==True:
        print("!")
        time.sleep(1)

c=ipywidgets.interactive(f,x=False)
c

1 个答案:

答案 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,依此类推。