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

