gpt4 book ai didi

python - 有没有办法在python的streamlit包的多选小部件中添加 "select all"选项?

转载 作者:行者123 更新时间:2023-12-03 16:48:19 29 4
gpt4 key购买 nike

我正在开发 streamlit应用程序,其中包含一个具有 10 个选项的多选小部件。是否有替代方法可以添加一个选择所有选项的按钮,以避免一个一个地选择它们?
我尝试向多选添加上一个按钮,但使用另一个小部件会重置选择。这是一个示例代码:

import streamlit as st

if st.sidebar.button('Add all years'):
year_filter = st.sidebar.multiselect('Select a year',[2000,2001,2002,2003,2004], default=[2000,2001,2002,2003,2004])
else:
year_filter = st.sidebar.multiselect('Select a year',[2000,2001,2002,2003,2004], default=[2000])

type_filter = st.sidebar.multiselect('Choose a type',['Control','Experimental'], default=['Experimental'])

st.write(year_filter, type_filter)

最佳答案

有一种方法可以使用 state :

import streamlit as st
from streamlit.ReportThread import get_report_ctx
from streamlit.hashing import _CodeHasher
from streamlit.server.Server import Server


class _SessionState:
def __init__(self, session, hash_funcs):
"""Initialize SessionState instance."""
self.__dict__["_state"] = {
"data": {},
"hash": None,
"hasher": _CodeHasher(hash_funcs),
"is_rerun": False,
"session": session,
}

def __call__(self, **kwargs):
"""Initialize state data once."""
for item, value in kwargs.items():
if item not in self._state["data"]:
self._state["data"][item] = value

def __getitem__(self, item):
"""Return a saved state value, None if item is undefined."""
return self._state["data"].get(item, None)

def __getattr__(self, item):
"""Return a saved state value, None if item is undefined."""
return self._state["data"].get(item, None)

def __setitem__(self, item, value):
"""Set state value."""
self._state["data"][item] = value

def __setattr__(self, item, value):
"""Set state value."""
self._state["data"][item] = value

def clear(self):
"""Clear session state and request a rerun."""
self._state["data"].clear()
self._state["session"].request_rerun()

def sync(self):
"""Rerun the app with all state values up to date from the beginning to fix rollbacks."""

# Ensure to rerun only once to avoid infinite loops
# caused by a constantly changing state value at each run.
#
# Example: state.value += 1
if self._state["is_rerun"]:
self._state["is_rerun"] = False

elif self._state["hash"] is not None:
if self._state["hash"] != self._state["hasher"].to_bytes(self._state["data"], None):
self._state["is_rerun"] = True
self._state["session"].request_rerun()

self._state["hash"] = self._state["hasher"].to_bytes(self._state["data"], None)


def _get_session():
session_id = get_report_ctx().session_id
session_info = Server.get_current()._get_session_info(session_id)

if session_info is None:
raise RuntimeError("Couldn't get your Streamlit Session object.")

return session_info.session


def _get_state(hash_funcs=None):
session = _get_session()

if not hasattr(session, "_custom_session_state"):
session._custom_session_state = _SessionState(session, hash_funcs)

return session._custom_session_state


def main():
state = _get_state()

if state.previous_years_selected is None:
state.previous_years_selected = [2000]

if st.sidebar.button('Add all years'):
year_filter = st.sidebar.multiselect('Select a year', [2000,2001,2002,2003,2004], default=[2000,2001,2002,2003,2004])
else:
year_filter = st.sidebar.multiselect('Select a year', [2000,2001,2002,2003,2004], default=state.previous_years_selected)

# The next default (in case no one clicks on "Add all years")
# will be the current years selected
state.previous_years_selected = year_filter

state.sync()


if __name__ == "__main__":
main()
_StateSession对象在 Streamlit 的重新加载中保存数据,这意味着如果您与小部件交互,页面会重新加载,但 state保留信息。
在这里,我们保留上次与“年份选择器”交互期间选择的年份的信息,并将其作为下一次重新加载的默认值 ( default=state.previous_years_selected )。
您可以将任何您想要的数据添加到 state目的。在修改它之前确保它确实存在:
if state.previous_years_selected is None:
state.previous_years_selected = [2000]

关于python - 有没有办法在python的streamlit包的多选小部件中添加 "select all"选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63059894/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com