如何在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
相关产品推荐
相关产品推荐

