使用ipywidgets的observe回调创建部件时无法正常显示部件的问题求助
使用ipywidgets的observe回调创建部件时无法正常显示部件的问题求助
我最近在用ipywidgets开发的时候遇到了一个棘手的问题:直接调用函数创建部件时一切正常,但把创建部件的逻辑放到widget.RadioButtons.observe的回调里执行,部件就死活显示不出来了。
能正常运行的测试代码
先给大家看一个能正常工作的测试用例——直接调用创建Textarea部件的函数,界面上能正常显示出输入框:
from ipyfilechooser import FileChooser import sys import os sys.path.append("shared/heminger/lib/dcdat") sys.path.append("shared/heminger/lib/combustion_functions") import converter import DataViz import ipywidgets as widgets from ipywidgets import TwoByTwoLayout, Layout def create_sensors_list_widget(): sensor_list = widgets.Textarea( value='tag,tag2', placeholder='Type something', description='List of Sensors (separated by comma)', disabled=False ) display(sensor_list) create_sensors_list_widget()
出现问题的业务代码
我现在想实现的功能是:根据单选按钮的选择,动态显示对应的交互部件(目前还没加切换选项时移除旧部件的逻辑,先聚焦显示问题)。
现在我能确定回调函数确实被执行了——控制台日志里能看到我加的打印内容,但创建出来的部件就是不显示在界面上。完整代码如下:
from ipyfilechooser import FileChooser import sys import os import ipywidgets as widgets from ipywidgets import TwoByTwoLayout, Layout output_radio_selected = widgets.Text() button_all_sensors = widgets.RadioButtons( options=['Read all sensors', 'Sensors from File', 'Manual Entry'], value='Read all sensors', description='Read all sensors?:', disabled=False ) def create_sensor_option_widgets(): print('test') create_sensors_list_widget() if selected_option == 'Sensors from File': print(' from file' ) create_sensors_from_file_widget() elif selected_option == 'Manual Entry': create_sensors_list_widget() print(' selected manual entry') else: print('oops') def create_sensors_from_file_widget(): sensor_file = FileChooser('/') sensor_file.title = '<b>File List Containing Sensors</b>' sensor_file def create_sensors_list_widget(): sensor_list = widgets.Textarea( value='test1, test2', placeholder='Type something', description='List of Sensors (separated by comma)', disabled=False ) display(sensor_list) def bind_selected_to_output(sender): global selected_option # 全局变量用来保存用户选择,方便后续代码复用 output_radio_selected.value = button_all_sensors.value selected_option = output_radio_selected.value # 将选中值赋值给变量 print('Selected option set to: ' + selected_option) # 测试用打印 create_sensor_option_widgets() button_all_sensors.observe(bind_selected_to_output, names=['value']) display(button_all_sensors)
注:单选按钮的值传递和状态变更触发函数的代码,我是参考了关于“ipywidget observe单次状态变更多次触发”的相关内容写的。
备注:内容来源于stack exchange,提问作者Mike H
相关产品推荐
相关产品推荐

