Ipython Widgets(如何制作计时器)

时间:2018-03-01 18:05:29

标签: python jupyter-notebook ipython-parallel ipywidgets

我制作了这个计时器小部件,它按照我想要的方式工作,但它锁定了笔记本电脑,因此我无法同时执行其他代码单元。

这是我的意思的一个例子:

enter image description here

有关让小部件在后台执行的任何想法吗?

如果它有帮助,这里是制作上述小部件的代码:

import ipywidgets as widgets
from IPython.display import display, Javascript
from traitlets import Unicode, validate
import time

class Timer(widgets.DOMWidget):
    _view_name = Unicode('HelloView').tag(sync=True)
    _view_module = Unicode('hello').tag(sync=True)
    _view_module_version = Unicode('0.1.0').tag(sync=True)
    value = Unicode('00:00:00').tag(sync=True)

    def timeit(self, b, limit=180):
        #display(self)
        hours = 0
        mins = 0
        secs = 0
        for i in range(1,(limit*60+1)):
            if i%60 == 0:
                if i%3600 == 0:
                    secs = 0
                    mins = 0
                    hours += 1
                else:
                    secs = 0
                    mins += 1
            else:
                secs += 1
            time.sleep(1)
            self.value = '{hour:02}:{minute:02}:{second:02}'.format(hour=hours,minute=mins,second=secs)


def display_timer(timer):
    button = widgets.Button(description="Start Timer", button_style='info')
    display(button)
    display(timer)
    button.on_click(timer.timeit)

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。有关详细信息,请阅读此doc

使用threading库使更新功能(在我的情况下,每秒更新一次的计时器)单独运行,这样您仍然可以执行其他代码单元。

另外,我尝试在这样的简单测试函数上做了几个%%timeit

[x*=x for i in range(20)]

看起来在后台运行此计时器窗口小部件并不会导致执行时间显着增加。