Хорошо, я понял, как это сделать - приведенный ниже код основан на этом ответе .
from ipywidgets import Button, HBox
import asyncio
#function for waiting for button clicks
def wait_for_change(widget1, widget2):
future = asyncio.Future()
def getvalue(change):
future.set_result(change.description)
widget1.on_click(getvalue, remove=True)
widget2.on_click(getvalue, remove=True)
widget1.on_click(getvalue)
widget2.on_click(getvalue)
return future
#annotation buttons
button1=Button(description="bird")
button2=Button(description="fish")
#terms to annotate
list_to_tag = ["seagull", "flounder", "trout", "albatross"]
tagged_animals = []
В следующем блоке кода используется сопрограмма и asyncio
(этот ответ объясняет, что здесь происходит).
#use a coroutine function to iterate through all items to annotate
async def f():
for i in list_to_tag:
print(i)
x = await wait_for_change(button1,button2)
tagged_animals.append(x)
return tagged_animals
Затем вызовите функции и сделайте аннотации.
#iterate through annotations, save results
annotations = asyncio.create_task(f())
#display buttons
HBox([button1,button2])
Наконец, как только все элементы аннотированы, откройте аннотации.
#get the results
annotations.result()
['bird', 'fish', 'fish', 'bird']