【问题标题】:How to lazify output in Tabbed Layout in jupyter notebook?如何在 jupyter notebook 的选项卡式布局中延迟输出?
【发布时间】:2019-07-09 09:30:47
【问题描述】:

我想使用 ipywidgets 在 jupyter notebook 中创建一个选项卡式布局。我只想在单击特定选项卡时处理它的输出。换句话说,延迟输出。

from ipywidgets import widgets

out1 = widgets.Output()
with out1:
    get_output_1()

out2 = widgets.Output()
with out2:
    get_output_2()

out = widgets.Tab([out1, out2])
out.set_title(0, 'out1')
out.set_title(1, 'out2')

display(out)

我希望函数 get_output_1() 和 get_output_2() 仅在单击相应选项卡时被调用。

请帮帮我。

【问题讨论】:

    标签: python jupyter-notebook ipywidgets


    【解决方案1】:

    您可以使用observe 函数来检测正在选择哪个选项卡,然后从字典中选择正确的输出小部件,运行您的函数,然后显示返回值。

    您可能希望长时间运行的函数具有 @lru_cache 装饰器,这样当您在选项卡之间来回滑动时,您的等待时间会更短。

        from IPython.display import clear_output, display
        import time
        import ipywidgets as widgets
        from functools import lru_cache
    
        # set up a dictionary of Output widgets
        outputs = {i: widgets.Output() for i in range(0,3)}
    
        # add the Output widgets as tab childen
        tab = widgets.Tab()
        tab.children = list(outputs.values())
        for i, title in outputs.items():
            tab.set_title(i, 'Tab '+str(i))
    
        def print_on_select(widget):
        #     get the correct Output widget based on the index of the chosen tab
            tab_idx = widget['new']
            output_widget = outputs[tab_idx]
            with output_widget:
                clear_output()
                print('running long function')
                value = long_running_function(tab_idx)
                clear_output()
                print(value)
    
        @lru_cache(32)
        def long_running_function(tab_idx):
            time.sleep(2)
            return 'this is tab number ' + str(tab_idx)
    
        tab.observe(print_on_select, names='selected_index')
    
        display(tab)
    

    【讨论】:

    • 很好的答案,谢谢!可能值得添加的一件事是在调用 observe() 之前使用 with outputs[0]: display('something') 显示初始选项卡内容的代码,无需任何交互。
    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2021-06-01
    • 1970-01-01
    • 2020-06-09
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多