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

Streamlit 1.30.0版本Generate Data按钮无法激活问题求助

Streamlit 1.30.0中「Generate Data」按钮无法激活的修复方案

问题概述

基于Streamlit开发的合成数据生成应用,升级至1.30.0版本后「Generate Data」按钮始终无法激活(1.29.0版本运行正常)。应用核心流程:

  • 收集用户输入的字段名与字段类型
  • 收集领域信息与描述内容
  • 所有必填项填写完成后激活生成按钮,触发CSV格式合成数据的生成与下载

问题原因

Streamlit 1.30.0对表单组件的状态同步逻辑做了优化:表单内的组件返回值在提交前不会自动同步到session_state。原代码中先将组件值存入session_state再判断空值的逻辑,会导致all_fields_filled基于旧的session_state值计算,无法正确反映当前用户输入状态,最终按钮始终处于禁用状态。

修复代码

调整后的字段添加模块代码

col_manual_data_spec, col_csv_upload = st.columns([3, 2])

with col_manual_data_spec:
    st.markdown("<div class='box'>", unsafe_allow_html=True)
    st.subheader('Manual Data Specification')

    if st.button('Add Field'):
        add_field()
    
    with st.form(key='manual_data_form'):
        all_fields_filled = True
        # 临时存储当前输入的字段值,后续统一更新session_state
        temp_field_names = []
        temp_field_types = []
        
        for i in range(len(st.session_state['field_names'])):
            col1, col2 = st.columns([3, 2])
            with col1:
                field_name = st.text_input(
                    f'Field Name {i+1}', 
                    value=st.session_state['field_names'][i], 
                    key=f'field_name_{i}'
                )
                temp_field_names.append(field_name)
                # 直接用当前输入值判断是否为空
                if not field_name:
                    all_fields_filled = False
            with col2:
                field_type = st.selectbox(
                    f'Field Type {i+1}', 
                    options, 
                    index=options.index(st.session_state['field_types'][i]) if st.session_state['field_types'][i] in options else 0, 
                    key=f'field_type_{i}'
                )
                temp_field_types.append(field_type)
                # 直接用当前选择值判断是否为空
                if not field_type:
                    all_fields_filled = False
        
        # 循环结束后统一更新session_state,避免状态不同步
        st.session_state['field_names'] = temp_field_names
        st.session_state['field_types'] = temp_field_types

        domain = st.selectbox('Domain Info (Mandatory)', [''] + domains, key='domain_info')
        description = st.text_area('Description (Mandatory)', key='description_info')
        # 直接用组件返回值判断必填项是否为空
        if not domain or not description:
            all_fields_filled = False

        submit_button = st.form_submit_button('Generate Data', disabled=not all_fields_filled)

关键修改点

  1. 空值判断逻辑调整:不再依赖session_state存储的值,直接使用组件当前的返回值判断是否为空,确保all_fields_filled能实时反映用户输入状态。
  2. session_state更新时机优化:先用临时列表存储所有字段的当前输入值,循环结束后统一更新session_state,避免循环内更新导致的状态不同步问题。

验证说明

修改后,当用户填写完所有必填字段(字段名、字段类型、领域、描述)时,「Generate Data」按钮会自动激活;若有任意必填项为空,按钮保持禁用状态,符合预期逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:37:46