You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 14:23:08