【问题标题】: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
      

      希望这可以帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-13
        • 2015-11-23
        • 2018-06-29
        相关资源
        最近更新 更多