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

如何批量获取ipywidget组件取值创建pandas DataFrame

解决方案

你当前的代码已经按列把所有输入控件提前存在了dd_list/dd_list1/dd_list2/dd_list3四个列表中,完全不需要逐行硬编码取值,也不需要反向从VBox的children属性里取控件,直接按索引遍历所有控件就能一次性生成目标DataFrame,自动适配动态行数,还能避免你原代码里VBox4.children[21]这类手误导致的索引错误。

核心实现代码

替换你原来逐行写portfolio_df的部分即可:

# 获取总行数,自动适配控件数量变化
row_num = len(dd_list)
dataset = []
for idx in range(row_num):
    # 按行提取四列控件的取值
    row_data = [
        dd_list[idx].value,
        dd_list1[idx].value,
        dd_list2[idx].value,
        dd_list3[idx].value
    ]
    dataset.append(row_data)

# 一次性生成DataFrame,无需逐行append
portfolio_df = pd.DataFrame(
    dataset,
    columns=['Product Name','Units','Price', 'Invested Amount']
)

可选优化

你现在创建四组FloatText控件的代码重复度很高,可以封装成工具函数减少冗余:

def init_floattext_col(desc, width, default_value=0, is_product_col=False):
    col_widgets = []
    for i in range(len(barrier_list)):
        if is_product_col:
            # 第一列产品名的描述为对应ISIN,默认值取产品名字段
            widget = ipw.FloatText(
                description=barrier_list['ISIN'][i],
                value=barrier_list['Product Name'][i],
                disabled=False,
                layout={'width': width}
            )
            widget.style.description_width = 'initial'
        else:
            widget = ipw.FloatText(
                description=desc,
                value=default_value,
                layout={'width': width}
            )
        col_widgets.append(widget)
    return col_widgets

# 初始化四列控件
dd_list = init_floattext_col(desc="", width='350px', is_product_col=True)
dd_list1 = init_floattext_col(desc="Units", width='200px')
dd_list2 = init_floattext_col(desc="Price", width='200px')
dd_list3 = init_floattext_col(desc="Value", width='200px')

如果确实需要从VBox容器层面取值,逻辑完全一致,只需要把列表取值替换为VBoxx.children[idx].value即可,但优先用提前存储的控件列表更稳妥,不会因为后续调整VBox子组件顺序出现取值错位。


内容的提问来源于stack exchange,提问作者breaker7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:39:17