我有这个代码ipython代码:
import ipywidgets as widgets
from IPython.display import display
import time
w = widgets.Dropdown(
options=['Addition', 'Multiplication', 'Subtraction'],
value='Addition',
description='Task:',
)
def on_change(change):
print("changed to %s" % change['new'])
w.observe(on_change)
display(w)它如预期的那样工作。当小部件的值发生变化时,将触发on_change函数。但是,我希望运行一个长时间的计算,并定期检查小部件的更新。例如:
for i in range(100):
time.sleep(1)
# pull for changes to w here.
# if w.has_changed:
# print(w.value)我怎样才能做到这一点?
发布于 2017-04-15 22:57:04
作为参考,我似乎能够完成期望的轮询
import IPython
ipython = IPython.get_ipython()
ipython.kernel.do_one_iteration()(我仍然希望能得到一些反馈,看看这是偶然的还是设计的。)
发布于 2017-04-14 23:45:20
我认为您需要使用线程并将其挂钩到ZMQ事件循环中。这个要点说明了一个例子:
https://gist.github.com/maartenbreddels/3378e8257bf0ee18cfcbdacce6e6a77e
发布于 2019-07-24 01:14:24
为了详细说明OP的自我回答,这是可行的。它强制小部件在循环中的任意点与内核同步。这可以在访问widget.value之前完成。
因此,全面的解决办法是:
import IPython
ipython = IPython.get_ipython()
last_val = 0
for i in range(100):
time.sleep(1)
ipython.kernel.do_one_iteration()
new_val = w.value
if new_val != old_val:
print(new_val)
old_val = new_valhttps://stackoverflow.com/questions/43420500
复制相似问题