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

Streamlit执行操作后Dialog模态框无法弹出的问题排查

问题分析与解决方案

核心问题

你的代码存在两个关键问题导致模态框无法弹出:

  1. 按钮嵌套导致状态丢失:Edit Relationships按钮嵌套在st.button('send')的if代码块中。Streamlit每次用户交互都会重新运行整个脚本,点击send按钮后,脚本会执行一次并渲染Edit Relationships按钮,但页面重跑后st.button('send')的返回值会恢复为False,此时Edit Relationships按钮会被移除,无法触发后续点击。
  2. 对话框触发逻辑失效:即使你快速点击Edit Relationships按钮,页面重跑后result变量已不在当前执行上下文里,且send按钮的条件不成立,代码不会走到调用edit_relationships(result)的逻辑。

修复后的代码

import streamlit as st

st.title("Simulator")

tab_names = ["tab1", "tab2"]
tab1, tab2 = st.tabs(tab_names)

@st.dialog("Edit your relationships")
def edit_relationships(result):
    edit_options = tuple(result)
    selection = st.selectbox(
        "Select an entity relationship",
        edit_options
    )
    st.write(f"This is a dialog {selection}")
    if st.button("Submit"):
        st.session_state.vote = 'pear'
        st.rerun()

with tab1:
    st.write("This is the first tab")

with tab2:
    query = st.text_input("Enter the entity", key='t2tinput')

    # 初始化会话状态存储result
    if 'result' not in st.session_state:
        st.session_state.result = None

    if st.button('send', key='t2button'):
        try:
            # 模拟API返回结果,存入会话状态
            st.session_state.result = ['banana', 'apple', 'pear']
        except Exception as e:
            st.error(f"Error: {e}")

    # 当会话状态中有result时,显示编辑按钮
    if st.session_state.result is not None:
        if st.button("Edit Relationships"):
            edit_relationships(st.session_state.result)

关键改动说明

  • 用会话状态存储结果:将result存入st.session_state,确保页面重跑后数据不会丢失。
  • 分离按钮逻辑:把Edit Relationships按钮移到send按钮的if块外,通过会话状态判断是否显示该按钮,避免按钮随send按钮的状态消失。
  • 稳定触发对话框:点击Edit Relationships按钮时,直接从会话状态中读取result并传入对话框函数,保证触发逻辑有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:53:18