如何通过代码批量勾选/取消勾选Streamlit中的所有复选框?
批量控制Streamlit复选框的全选/全清实现
问题场景
通过遍历DataFrame行创建侧边栏复选框,默认未勾选,单个勾选/取消操作正常,但自定义的全选、全清按钮无法生效:
原创建复选框代码:
options = [] for idx, row in df.iterrows(): option = st.sidebar.checkbox(label=f"{row['title']} ({row['option']})", key=idx) options.append([row['title'], option])
原全选/全清函数(无效):
def select_all_fields(): options = [] for idx, row in gdf_paper_dry_run.iterrows(): option = st.sidebar.checkbox(label=f"{row['label']} ({row['option']})", key=idx, value=True) options.append([row['label'], option]) def clear_all_fields(options_list): options = [] for idx, row in gdf_paper_dry_run.iterrows(): option = st.sidebar.checkbox(label=f"{row['label']} ({row['option']})", key=idx, value=False) options.append([row['label'], option])
问题原因
直接在函数内重新渲染复选框并设置value的方式不生效,因为Streamlit的组件状态由session_state管理,函数执行时的临时渲染无法持久修改组件状态,且组件渲染逻辑应该统一放在主流程中,而非按钮点击的回调里。
正确实现方案
利用Streamlit的session_state直接修改对应复选框key的状态,再统一渲染复选框:
import streamlit as st import pandas as pd # 替换为你的实际DataFrame df = pd.DataFrame({ "title": ["选项1", "选项2", "选项3"], "option": ["A", "B", "C"] }) # 初始化session_state,存储每个复选框的状态 if "checkbox_states" not in st.session_state: st.session_state.checkbox_states = {idx: False for idx in df.index} # 全选按钮逻辑 if st.sidebar.button("全选"): for idx in df.index: st.session_state.checkbox_states[idx] = True # 全清按钮逻辑 if st.sidebar.button("全清"): for idx in df.index: st.session_state.checkbox_states[idx] = False # 统一渲染复选框,读取session_state中的状态 options = [] for idx, row in df.iterrows(): option_state = st.sidebar.checkbox( label=f"{row['title']} ({row['option']})", key=idx, value=st.session_state.checkbox_states[idx] ) # 同步用户手动修改的状态到session_state st.session_state.checkbox_states[idx] = option_state options.append([row['title'], option_state]) # 可选:展示已选中的选项 st.write("已选中的选项:") selected = [item[0] for item in options if item[1]] st.write(selected)
核心逻辑说明
- 用
session_state.checkbox_states字典存储每个复选框(对应DataFrame行索引idx)的勾选状态,实现状态持久化 - 全选/全清按钮点击时,直接遍历修改
session_state.checkbox_states中的所有值为True或False - 复选框渲染时,从
session_state读取当前状态作为value,同时将用户手动操作后的状态写回session_state,保证状态同步
内容的提问来源于stack exchange,提问作者Niko Gamulin
相关产品推荐
相关产品推荐

