我想使用 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()
仅在单击相应选项卡时被调用。
请帮帮我。
您可以使用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)
我是一名优秀的程序员,十分优秀!