Streamlit 按钮只能使用一次

Posted

技术标签:

【中文标题】Streamlit 按钮只能使用一次【英文标题】:Streamlit button works only once 【发布时间】:2020-04-05 21:22:54 【问题描述】:

我想创建一个简单的流光应用程序,当您按下按钮时,它会增加 x 并显示 x 的新值。

但是,它只适用于第一次“x 只显示值 2 并且不增加”

import streamlit as st

x = 1
if st.button("Increment x"):
    x=x+1
    st.text(x)

【问题讨论】:

我不知道 streamlit,但从算法上讲,你的 if 条件只测试了一次。您应该尝试在 if 之前添加一个循环,以便它可以多次测试您的条件。 是的,我知道,但从 streamlit 来看并非如此,例如,如果您使用“滑块”,它将是交互式的,无需循环。 【参考方案1】:

每次您进行更改/交互时,Streamlit 都会重新运行网页脚本。因此,每次单击按钮时,它都会重置 x=1,然后将 x 加 1。

您的按钮工作正常,问题在于 streamlit 处理事件的方式。您可以尝试使用 st.cache 来解决此问题,但我从未尝试过复制您的目标。

【讨论】:

这是正确答案。我补充说,近期 Streamlit 路线图中有一个“状态”的概念,它将构成保存和构建用户输入的正确方式。 (我是一名 Streamlit 开发人员。) 嗨,@nthmost,您能否提供一个使用缓存构建具有多次单击功能的按钮的示例? 嗨@AyushChaurasia - 您应该尝试下面答案中的 SessionState 示例,而不是滥用 st.cache。 :) 不久之后 Streamlit 就会发布我们的下一个功能,我们简称为“状态”,这将构成执行此操作的正确方法。谢谢! 同意,请不要相信我的话。我只做了一些轻微的修改,缓存是我学到的唯一具有这种能力的函数。【参考方案2】:

https://gist.github.com/tvst/036da038ab3e999a64497f42de966a92

嘿,这个包对我很有用。

将代码下载到您正在处理的同一个文件夹中并繁荣:

import SessionState

ss = SessionState.get(x=1)
    
if st.button("Increment x"):
    ss.x = ss.x + 1
    st.text(ss.x)

【讨论】:

自从我上传了这个,Streamlit 已经添加了他们自己的版本:docs.streamlit.io/en/stable/add_state_app.html

以上是关于Streamlit 按钮只能使用一次的主要内容,如果未能解决你的问题,请参考以下文章

如何在streamlit上运行视频?

一次只能选择一个单选按钮

用户一次只能按住一个键盘按钮

javascript中怎么实现按钮只能点击一次?

为啥我只能在我的 android 通知中按一次播放/暂停按钮?

iOS - 只能点击一次 html 按钮