英文:
python streamlit sidebar resetting on entry of input
问题
你的代码中存在一个问题,导致在输入 input1 后重置到 step 1。问题出现在以下部分:
if reset:
placeholder = st.empty()
在你点击 "Reset" 按钮后,它会创建一个空白的 placeholder
,但没有其他逻辑来保持用户在第二步。你需要在这里添加一些代码,以确保用户在第二步时不会重置到第一步。具体的解决方案可能会依赖于你的应用的需求,但你可以考虑使用状态变量或条件来控制用户界面的状态,以确保用户能够顺利完成第二步操作。
如果你需要更具体的帮助,可以提供更多关于你的应用和预期行为的信息。
英文:
I am creating a streamlit
app where on the sidebar I have first a file uploader and a button. Once the file is uploaded and then the button is pressed, it shows more input option and two more buttons for user to finally sumbit. When I am at the second step, after user enters the input, it resets the sidebard to go back to step 1 and earlier hidden options go back to hidden.
Here is my code:
file = st.sidebar.file_uploader('Upload',type=["pdf","txt"])
#this is step1
if file is not None:
# Save uploaded file to 'F:/tmp' folder.
save_folder = 'F:/tmp'
save_path = Path(save_folder, file.name)
with open(save_path, mode='wb') as w:
w.write(uploaded_file.getvalue())
with st.sidebar:
if save_path.exists():
st.write("File uploaded")
co1, co2= st.sidebar.columns([1, 1])
submit = co1.button("Submit", use_container_width=True)
if submit:
input1, input2, input3 = compo() # local function which sets streamlit sidebar inputs
st.sidebar.markdown("---")
c1,c2 = st.sidebar.columns([1,1])
reset = c1.button("Reset", use_container_width=True)
fin_submit = c2.button("Final Submit", use_container_width=True)
#When I enter input1 and then go click to enter input2, it resets to step 1
if reset:
placeholder = st.empty()
if fin_submit:
if file is not None:
if (input1 == "Hello") or (input2 == "There"):
placeholder.empty()
# Call processng function and display result
else:
placeholder.empty()
st.error("Sorry!")
else:
if (input1 == "You") or (input2 == "there"):
placeholder.empty()
# Call processng function and display result
else:
placeholder.empty()
st.error("Sorry!")
Here is the code for compo()
:
def compo():
c1,c2 = st.sidebar.columns(2)
input1 = c1.selectbox(label = "Input 1",options = ['Hello',"You"])
input2 = c2.selectbox(label = "Input 2", options = ["There","there"])
input3 = st.sidebar.slider("Number",min_value=1, max_value=10, value=1, step=1)
st.sidebar. markdown("---")
return input1, input2, input3
I don't know why as I enter a value in input1, it resets to step1
答案1
得分: 1
按钮不会保留状态。它们在页面加载时因点击而返回True,然后立即变为False。如果你将某些内容嵌套在按钮内,它将在用户执行操作后消失(因为页面重新加载,按钮变为false)。
参见这个博客帖子中的第一个观点。
这里有另一个类似问题的答案。
要嵌套按钮,你可以通过回调函数来跟踪一个布尔标志,将其设置为True:
import streamlit as st
if 'submitted' not in st.session_state:
st.session_state.submitted = False
def submit():
st.session_state.submitted = True
st.button('提交', on_click=submit)
if st.session_state.submitted:
st.write('提交按钮已被点击。')
st.button('什么也不做')
由于'什么也不做'按钮是基于会话状态中的'submitted'值而不是直接基于'提交'按钮的输出来条件控制的,因此当被点击时它会保留在屏幕上。
英文:
Buttons do not retain state. They return True on the page load resulting from their click and then immediately go back to False. If you nest something inside a button, it will go away as soon as the user does something (because the page reloads and the button becomes false).
See the first point in this blog post.
Here's another answer for a similar question.
To nest buttons, you can track a boolean flag that gets set to True by a callback function:
import streamlit as st
if 'submitted' not in st.session_state:
st.session_state.submitted = False
def submit():
st.session_state.submitted = True
st.button('Submit', on_click=submit)
if st.session_state.submitted:
st.write('The submit button was clicked.')
st.button('Do nothing')
Since the 'Do Nothing' button is conditioned on the 'submitted' value in session state instead of directly on the output of the 'Submit' button, it will stay on the screen when clicked.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论