Приостановить виджеты Jupyter Notebook, ожидая ввода пользователя - PullRequest
1 голос
/ 19 марта 2019

У меня та же проблема, что и у TheInterestedOne , спросили .Мне нужно создать две кнопки для пользователя и предложить пользователю нажать одну из двух кнопок в цикле, чтобы следующая итерация цикла происходила только после выбора пользователя.Я прочитал этот источник , но не могу заставить его работать на кнопку.Я не понимаю, как меняется атрибут виджета при использовании кнопки.

from functools import wraps
def yield_for_change(widget, attribute):
    def f(iterator):
        @wraps(iterator)
        def inner():
            i = iterator()
            def next_i(change):
                try:
                    i.send(change.new)
                except StopIteration as e:
                    widget.unobserve(next_i, attribute)
            widget.observe(next_i, attribute) //**button.on_click(on_button_clicked) 
                                                                may be?**
            # start the generator
            next(i)
        return inner
    return f


from ipywidgets import Button
button=Button()


def on_button_clicked():
    print("Button clicked.")


@yield_for_change(button, 'value')
def f():
    for i in range(10):
        print('did work %s'%i)
        x = yield
        button.on_click(on_button_clicked)

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Эта версия использует awaitio и модифицируется для кнопок.

from ipywidgets import Button
import asyncio

def wait_for_change(widget):
    future = asyncio.Future()
    def getvalue(change):
        future.set_result(change.description)
        widget.on_click(getvalue, remove=True) 
        # we need to free up the binding to getvalue to avoid an IvalidState error
        # buttons don't support unobserve
        # so use `remove=True` 
    widget.on_click(getvalue)
    return future

button=Button(description="wow")

list_to_tag = ["one", "two", "three", "four"]

async def f():
    for i in list_to_tag:
        print('going to tag ', i)
        x = await wait_for_change(button)
        print("tagged ", i, "with  %s"%x)
        print("")

asyncio.create_task(f())
button
0 голосов
/ 21 марта 2019

Вот пример, адаптированный для Button.Основные изменения в декораторе: замена observe на on_click, что эквивалентно наблюдению за кнопкой.

from functools import wraps
def yield_for_change(widget):
    def f(iterator):
        @wraps(iterator)
        def inner():
            i = iterator()
            def next_i(change):
                try:
                    i.send(change)
                except StopIteration as e:
                    widget.unobserve(next_i, attribute)
            widget.on_click(next_i)
            # start the generator
            next(i)
        return inner
    return f


from ipywidgets import Button
button=Button()

def on_button_clicked():
    print("Button clicked.")


@yield_for_change(button)
def f():
    for i in range(10):
        print('did work %s'%i)
        x = yield

f()

button
...