如何批量获取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
相关产品推荐
相关产品推荐

