首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手动提取ipywidget值

手动提取ipywidget值
EN

Stack Overflow用户
提问于 2017-04-14 23:27:41
回答 4查看 663关注 0票数 3

我有这个代码ipython代码:

代码语言:javascript
复制
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函数。但是,我希望运行一个长时间的计算,并定期检查小部件的更新。例如:

代码语言:javascript
复制
for i in range(100):
    time.sleep(1)
    # pull for changes to w here.
    # if w.has_changed:
    #     print(w.value)

我怎样才能做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-04-15 22:57:04

作为参考,我似乎能够完成期望的轮询

代码语言:javascript
复制
import IPython
ipython = IPython.get_ipython()
ipython.kernel.do_one_iteration()

(我仍然希望能得到一些反馈,看看这是偶然的还是设计的。)

票数 2
EN

Stack Overflow用户

发布于 2017-04-14 23:45:20

我认为您需要使用线程并将其挂钩到ZMQ事件循环中。这个要点说明了一个例子:

https://gist.github.com/maartenbreddels/3378e8257bf0ee18cfcbdacce6e6a77e

也见https://github.com/jupyter-widgets/ipywidgets/issues/642

票数 0
EN

Stack Overflow用户

发布于 2019-07-24 01:14:24

为了详细说明OP的自我回答,这是可行的。它强制小部件在循环中的任意点与内核同步。这可以在访问widget.value之前完成。

因此,全面的解决办法是:

代码语言:javascript
复制
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_val
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43420500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档