如何基于JSON动态创建Streamlit表单与仪表盘?
基于JSON动态创建Streamlit仪表盘与表单
完全可以通过JSON数据动态生成Streamlit仪表盘和表单,你的代码出错是因为几个具体的使用问题,下面是问题分析和修正方案:
原代码的问题点
- 组件嵌套错误:在
st.text_input的label参数中使用st.title()是错误的,label需要传入字符串,不能嵌套Streamlit的组件调用 - 表单缺少提交按钮:Streamlit的表单必须包含
form.form_submit_button()才能正常触发提交逻辑 - 表单Key重复:循环中表单的key固定为
"form_one",如果后续有多个task,会出现组件key重复的报错,应该使用动态key - 字段拼写问题:JSON里的
"Sol d"应为笔误(比如应为"Solute"),会导致输入框显示异常
修正后的代码
import streamlit as st import json JSON_FILE = '''{ "project": "Prediction", "tasks": [ { "name":"Prediction Dashboard", "inputs": "Solute", "inputs_two":"Solvent", "desc":{ "Solute_Smile": "Solute Sequence", "Solvent_smile": "Solvent Sequence", "Probability_Score": "(in Kcal/mol) :" } } ] }''' def load_data(data): return json.loads(data) data = load_data(JSON_FILE) # 遍历tasks动态生成仪表盘内容 for idx, task in enumerate(data['tasks']): # 生成任务标题 st.title(task['name']) # 创建表单,使用动态key避免重复 with st.form(key=f"task_form_{idx}"): # 生成输入框,直接用字符串作为label,利用desc字段添加提示 solute_input = st.text_input(label=task['inputs'], help=task['desc']['Solute_Smile']) solvent_input = st.text_input(label=task['inputs_two'], help=task['desc']['Solvent_smile']) # 添加表单提交按钮 submit_btn = st.form_submit_button(label="执行预测") # 提交后处理逻辑 if submit_btn: st.write(f"输入的溶质序列: {solute_input}") st.write(f"输入的溶剂序列: {solvent_input}") # 这里可替换为实际预测逻辑,比如调用模型计算得分 st.success(f"预测完成,概率得分: **XX Kcal/mol**")
代码说明
- 使用
enumerate遍历tasks,同时获取索引生成动态表单key,避免重复报错 - 输入框的
help参数复用JSON里的desc字段,给用户提供输入提示 - 表单提交后可基于JSON配置的字段,动态执行后续业务逻辑(如预测计算)
内容的提问来源于stack exchange,提问作者daylightisminetocommand
相关产品推荐
相关产品推荐

