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

Streamlit标注界面切换单选选项时第二个单选框消失问题求助

问题原因

Streamlit的按钮是一次性状态,点击后页面刷新时,if st.button()的条件只会在点击那一次返回True,后续刷新会变回False,导致第二个单选框的代码块不再执行,切换选项时单选框就会消失。必须用st.session_state持久化跟踪每个示例的进度状态,才能维持交互流程的连续性。

修改后的代码
#!/usr/bin/env python3
import streamlit as st

# 初始化会话状态,持久化跟踪流程
if "current_idx" not in st.session_state:
    st.session_state.current_idx = 0
if "answers" not in st.session_state:
    st.session_state.answers = []
if "show_explanation" not in st.session_state:
    st.session_state.show_explanation = {}  # 记录每个示例是否进入解释选择阶段

columns = ["question", "answerA", "answerB", "answerC", "explanationA", "explanationB", "explanationC", "answer"]

with open('fake_data.tsv') as f:
    examples = [dict(zip(columns, line.strip().split("\t"))) for line in f]

def show_example():
    idx = st.session_state.current_idx
    # 所有示例处理完成后的逻辑
    if idx >= len(examples):
        st.write("所有示例已完成!")
        st.write("已收集的答案:", st.session_state.answers)
        # 此处可添加答案保存到文件/数据库的逻辑
        return
    
    example = examples[idx]
    st.header(f"示例 {idx+1}")
    st.subheader("上下文: TODO, wire this up")

    # 第一步:显示初始单选框
    answer_before = st.radio(
        example["question"],
        [example["answerA"], example["answerB"], example["answerC"], "multiple options"],
        key=f"q1-{idx}"
    )

    # 点击提交后,标记当前示例进入解释阶段
    if st.button("提交", key=f"b1-{idx}"):
        st.session_state.show_explanation[idx] = True

    # 第二步:显示带解释的单选框(仅当标记为显示时)
    if st.session_state.show_explanation.get(idx, False):
        answer_after = st.radio(
            f"{example['question']}(查看解释后选择)",
            [
                f"{example['answerA']}: {example['explanationA']}",
                f"{example['answerB']}: {example['explanationB']}",
                f"{example['answerC']}: {example['explanationC']}",
                "multiple options"
            ],
            key=f"q2-{idx}"
        )

        # 最后一个示例的完成按钮
        if idx + 1 == len(examples):
            if st.button("完成并保存", key=f"b2-{idx}"):
                st.session_state.answers.append((answer_before, answer_after))
                st.session_state.current_idx += 1
        # 非最后一个示例的跳转按钮
        else:
            if st.button("下一个示例", key=f"b2-{idx}"):
                st.session_state.answers.append((answer_before, answer_after))
                st.session_state.current_idx += 1
                # 重置当前示例的显示状态,避免影响后续示例
                st.session_state.show_explanation[idx] = False

show_example()
关键改动说明
  • 用st.session_state持久化核心状态:
    • current_idx:跟踪当前处理的示例索引
    • answers:存储用户每轮的两次选择结果
    • show_explanation:标记每个示例是否进入解释选择阶段
  • 按钮点击后通过修改会话状态控制界面切换,不再依赖按钮的一次性返回值,确保页面刷新后状态不丢失
  • 完成当前示例后重置其显示状态,避免干扰后续示例的渲染逻辑
  • 区分最后一个示例的按钮文案,交互逻辑更清晰
fake_data.tsv 格式要求

确保文件使用制表符分隔,内容示例:

question0	answerA0	answerB0	answerC0	explanationA0	explanationB0	explanationC0	acceptedAnswer0
question1	answerA1	answerB1	answerC1	explanationA1	explanationB1	explanationC1	acceptedAnswer1
question2	answerA2	answerB2	answerC2	explanationA2	explanationB2	explanationC2	acceptedAnswer2
question3	answerA3	answerB3	answerC3	explanationA3	explanationB3	explanationC3	acceptedAnswer3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:24:59