立即重新运行脚本。
当调用st.rerun()时,Streamlit 会停止当前脚本的运行,并且不再执行后续的语句。Streamlit 会立即将脚本排队以重新运行。
在片段中使用st.rerun时,您可以将重新运行的范围限定在片段内。但是,如果片段作为完整应用程序重新运行的一部分运行,则不允许进行片段范围的重新运行。
函数签名[source] | |
---|---|
st.rerun(*, scope="app") | |
参数 | |
scope ("app" 或 "fragment") | 指定应用程序的哪一部分应重新运行。如果 scope 是 "app" (默认),整个应用程序将重新运行。如果 scope 是 "fragment", Streamlit 只会重新运行调用此命令的片段。 设置 scope="fragment" 仅在片段重新运行期间有效。如果在 整个应用程序重新运行期间或在片段外部调用 st.rerun(scope="fragment"), Streamlit 将引发 StreamlitAPIException。 |
st.rerun
Caveats for
st.rerun
是控制应用程序逻辑的工具之一。虽然它非常适合原型设计,但可能会有一些不利的副作用:
- 额外的脚本运行可能效率低下且速度较慢。
- 过多的重新运行可能会使您的应用程序逻辑复杂化,并且更难跟踪。
- 如果误用,无限循环可能会导致您的应用程序崩溃。
在许多情况下,st.rerun
可以工作,回调 可能是一个更简洁的替代方案。容器 也可能有所帮助。
A simple example in three variations
st.rerun
更新较早的标题
使用 import streamlit as st
if "value" not in st.session_state:
st.session_state.value = "Title"
##### Option using st.rerun #####
st.header(st.session_state.value)
if st.button("Foo"):
st.session_state.value = "Foo"
st.rerun()
使用回调更新较早的标题
##### Option using a callback #####
st.header(st.session_state.value)
def update_value():
st.session_state.value = "Bar"
st.button("Bar", on_click=update_value)
使用容器更新较早的头部
##### Option using a container #####
container = st.container()
if st.button("Baz"):
st.session_state.value = "Baz"
container.header(st.session_state.value)
还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。