Streamlit标注问卷应用问题:食材对标注逻辑不符合预期
食材配对标注Streamlit应用修复方案
问题根源
Streamlit是脚本式执行机制,默认循环会一次性跑完所有迭代,不会等待用户交互,导致所有配对同时渲染,大数据量下体验崩溃。必须用st.session_state持久化状态,实现分步交互。
完整实现代码
import streamlit as st import itertools import pandas as pd import matplotlib.pyplot as plt # 食材样本数据 ingredients = ["鸡蛋", "番茄", "黄瓜", "牛肉", "土豆", "青椒"] # 初始化Session State状态 if "pairings" not in st.session_state: st.session_state.pairings = list(itertools.combinations(ingredients, 2)) if "current_idx" not in st.session_state: st.session_state.current_idx = 0 if "annotations" not in st.session_state: st.session_state.annotations = [] total_pairings = len(st.session_state.pairings) # 标注流程控制 if st.session_state.current_idx < total_pairings: current_pair = st.session_state.pairings[st.session_state.current_idx] st.subheader(f"标注配对 {st.session_state.current_idx + 1}/{total_pairings}") st.write(f"食材组合:{current_pair[0]} + {current_pair[1]}") # 标注选项(可根据需求自定义) label = st.selectbox( "请选择配对适配程度", ["完全不适合", "不太适合", "一般", "比较适合", "非常适合"], key=f"label_{st.session_state.current_idx}" ) col1, col2 = st.columns(2) with col1: if st.button("保存并进入下一组"): st.session_state.annotations.append({ "食材1": current_pair[0], "食材2": current_pair[1], "标注结果": label }) st.session_state.current_idx += 1 st.rerun() # 刷新页面加载下一组 with col2: if st.button("跳过当前组"): st.session_state.current_idx += 1 st.rerun() # 标注完成后展示结果 else: st.success("所有配对标注完成!") df = pd.DataFrame(st.session_state.annotations) # 展示标注数据 st.subheader("标注结果详情") st.dataframe(df) # 提供CSV下载 csv = df.to_csv(index=False).encode("utf-8") st.download_button( label="下载标注数据", data=csv, file_name="食材配对标注结果.csv", mime="text/csv" ) # 生成统计图表 st.subheader("标注结果统计") fig, ax = plt.subplots() df["标注结果"].value_counts().plot(kind="bar", ax=ax) ax.set_xlabel("适配程度") ax.set_ylabel("配对数量") ax.set_title("食材配对适配度分布") st.pyplot(fig)
关键功能说明
- 状态持久化:通过
st.session_state保存配对列表、当前标注位置、已标注数据,避免每次交互丢失进度 - 分步标注:仅渲染当前需要标注的配对,完成后更新索引并刷新页面,保证页面简洁
- 结果导出:将标注数据转为CSV格式提供下载,方便后续分析
- 可视化统计:用柱状图展示各适配程度的配对数量,直观呈现标注结果
内容的提问来源于stack exchange,提问作者PeCaDe
相关产品推荐
相关产品推荐

