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

如何在Streamlit应用中正确获取当前选中的标签页?

解决Streamlit获取当前选中标签页的问题

问题原因

你的代码中,三个标签的with块会每次页面刷新时全部执行,不管当前显示哪个标签,最后执行的C标签会将st.session_state["selected_tab"]覆盖为"C",这就是为什么始终返回C的原因。

解决方案一:直接利用Tabs组件的内置状态

给Tabs组件指定key,Streamlit会自动在session_state中维护当前选中标签的索引,通过索引映射到标签名即可:

import streamlit as st

def handle_submit():
    # 通过Tabs的key获取选中索引,映射到标签名
    tab_index = st.session_state["main_tabs"]
    tab_names = ["A", "B", "C"]
    selected_tab = tab_names[tab_index]
    st.markdown(f"Submit clicked! 当前选中标签:{selected_tab}")
    
    # 根据选中标签读取对应组件的值
    if selected_tab == "A":
        run_name = st.session_state["key1"]
        run_pref = st.session_state["key2"]
        st.markdown(f"A标签输入:Run Name={run_name}, Run Preference={run_pref}")
    elif selected_tab == "B":
        address = st.session_state["key3"]
        st.markdown(f"B标签输入:Address={address}")
    elif selected_tab == "C":
        user_pref = st.session_state["key4"]
        st.markdown(f"C标签输入:Preference={user_pref}")

username = st.text_input("Username:", key="username3")
password = st.text_input("Password:", type="password", key="password3")

# 给Tabs指定key,用于在session_state中获取选中状态
A, B, C = st.tabs(["A", "B", "C"], key="main_tabs")
with A:
    run_type_prefix = st.text_input("Enter Run Name:", value="", key="key1")
    run_type_preference = st.text_input("Enter Run Preference:", value="", key="key2")
with B:
    address = st.text_input("Enter Address:", value="", key="key3")
with C:
    user_input = st.text_input("Enter your preference:", value="", key="key4")

col1, col2 = st.columns([1, 1])
with col1:
    submit = st.button("Submit", key="mock_submit", on_click=handle_submit)
with col2:
    cancel = st.button("Cancel", key="mock_cancel")

解决方案二:监听标签切换更新状态(可选)

如果需要在标签切换时实时更新session_state中的选中标签,可以给Tabs组件添加on_change回调:

import streamlit as st

def update_selected_tab():
    tab_index = st.session_state["main_tabs"]
    tab_names = ["A", "B", "C"]
    st.session_state["selected_tab"] = tab_names[tab_index]

def handle_submit():
    st.markdown(f"Submit clicked! 当前选中标签:{st.session_state['selected_tab']}")
    # 根据选中标签处理对应逻辑
    if st.session_state["selected_tab"] == "A":
        run_name = st.session_state["key1"]
        st.markdown(f"读取A标签的Run Name:{run_name}")

# 初始化session_state
if "selected_tab" not in st.session_state:
    st.session_state["selected_tab"] = "A"

username = st.text_input("Username:", key="username3")
password = st.text_input("Password:", type="password", key="password3")

# 添加on_change回调,切换标签时更新选中状态
A, B, C = st.tabs(["A", "B", "C"], key="main_tabs", on_change=update_selected_tab)
with A:
    run_type_prefix = st.text_input("Enter Run Name:", value="", key="key1")
    run_type_preference = st.text_input("Enter Run Preference:", value="", key="key2")
with B:
    address = st.text_input("Enter Address:", value="", key="key3")
with C:
    user_input = st.text_input("Enter your preference:", value="", key="key4")

col1, col2 = st.columns([1, 1])
with col1:
    submit = st.button("Submit", key="mock_submit", on_click=handle_submit)
with col2:
    cancel = st.button("Cancel", key="mock_cancel")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:56:14