IPython Widget设置Continuous_Update=False后如何首次自动运行?
解决方法
要实现「滑块仅在释放鼠标时执行」和「Widget首次显示自动运行一次」两个需求,按以下步骤修改代码即可:
1. 为滑块关闭实时更新
找到interactive生成的滑块控件,设置continuous_update=False,避免拖拽过程中频繁触发函数:
# 遍历所有控件,为滑块设置关闭实时更新 for child in i_obj.children[:-1]: if isinstance(child, widgets.FloatSlider): child.continuous_update = False
也可以单独指定每个滑块:
# 分别给三个滑块设置关闭实时更新 i_obj.children[0].continuous_update = False # start_secs滑块 i_obj.children[1].continuous_update = False # resolution滑块 i_obj.children[2].continuous_update = False # duration滑块
2. 让Widget首次加载自动运行
在调用display()之后,直接调用一次动画函数animate_music(),它会使用函数定义的默认参数执行:
# 首次加载时自动执行一次动画 animate_music()
修改后的完整代码
from ipywidgets import interactive, widgets, HBox, VBox, Layout import traceback stereo_song_amp_wav, stereo_song_amp_aac, song_rate, song_duration = make_test_song(time_per_note=1) def animate_music(start_secs=0, resolution=0.25, duration=5): global stereo_song_amp_wav, stereo_song_amp_aac, song_rate, song_duration s = stereo_song_amp_aac[round(start_secs*song_rate):round((start_secs + duration)*song_rate),:] try: display_animation_fast([s], song_rate, view_window_secs=resolution, start_time_offset=start_secs) except: traceback.print_exc() return None i_obj = interactive(animate_music, start_secs=(0, song_duration, 0.25), resolution=(0.05,1.0,0.05), duration=(0.25, song_duration, 0.25)) # 设置滑块关闭实时更新 for child in i_obj.children[:-1]: if isinstance(child, widgets.FloatSlider): child.continuous_update = False output = i_obj.children[-1] h_layout = Layout(display='flex', flex_flow='row', justify_content='center', width='100%') v_layout = Layout(display='flex', flex_flow='column',justify_content='center', width='100%') i_obj.children[0].layout.width = '95%' controls = VBox([i_obj.children[0], HBox(i_obj.children[1:-1], layout = h_layout)], layout =v_layout) display(VBox([controls, output], layout = v_layout)) # 首次加载自动执行动画 animate_music()
内容的提问来源于stack exchange,提问作者user3735204
相关产品推荐
相关产品推荐

