【问题标题】:Streamlit dynamic UI to generate dynamic input widgets depending on value from a different input widgetStreamlit 动态 UI 可根据来自不同输入小部件的值生成动态输入小部件
【发布时间】:2023-02-10 21:33:09
【问题描述】:
我想打开这篇文章,因为我在 streamlit 的官方文档或任何提到如何执行此操作的资源中找不到任何内容。经过反复试验,我找到了一种方法,并将在下面发布答案。这是一个在 R shiny 中称为动态 UI 的功能,这是问题所在。
如何根据来自不同输入小部件的值生成动态输入小部件?例如,见下图,text_input 的编号称为产品代码 i 取决于来自 number_input 称为 Number of Products 的值。因此,如果有 x 个产品,则会动态生成 x 个 text_input。此外,还可以提取生成的text_input中的值。
【问题讨论】:
标签:
python
streamlit
variable-variables
dynamic-ui
【解决方案1】:
这是执行此操作的一种方法。
首先,使用列表理解来存储键(稍后用于从 text_input 中提取值的变量)和值 (text_input)。
接下来,使用键和值来设置类中的属性。
标记为 product2 的 text_input 的值可以使用类中的属性提取,例如使用 p.product2。
import streamlit as st
number_of_products = st.sidebar.number_input(label="Number of Products",
min_value=0, max_value=20, value=1)
class Products:
pass
p = Products()
keys = [str("product"+str(x+1)) for x in range(number_of_products)]
values = [st.sidebar.text_input(label=f"Product Code {x+1}", value=0) for x in range(number_of_products)]
for key, value in zip(keys, values):
setattr(p, key, value)
# each key's value is stored in the class as an attribute
st.write(p.product2)
使用dictionary和exec命令也可以动态声明变量,但是当text_input里面的值不是数字时,会产生错误。
【解决方案2】:
使用 streamlit 的会话状态时,可以生成动态输入小部件内容。但是,在输入小部件交互时,streamlit 刷新页面有一个潜在的缺点。
解决这个问题的一种方法是创建多个形式.例如,在您的情况下,您可以为“产品数量”创建一个表单,并将此值更新为会话状态。
接下来,您可以创建另一个接受此“产品数量”参数并创建 x 个输入小部件的表单。
import streamlit as st
with st.form("Number of Products"):
numProducts = st.number_input('Insert a number', key='numProducts')
submitForm = st.form_submit_button("Set Product Number")
if submitForm:
st.success("Please assign product codes below")
if 'numProducts' in st.session_state.keys():
with st.form("Product Codes"):
for i in range(st.session_state['numProducts']):
# insert text inputs with keys here
希望这可以帮助!