Streamlit 按钮 on_click 不刷新来自 API 端点 URL 的图像

Streamlit button on_click not refreshing images from API Endpoint URL

我是 Streamlit 的新手,我正在尝试构建一个简单的应用程序,它会在单击按钮时显示来自 https://cataas.com/cat 的猫图片。我有以下简单代码:

def show_kitty():
    st.image('https://cataas.com/cat')

st.button("Click for cats", on_click = show_kitty())

但是,应用程序会在第一次单击按钮时呈现图片,并且图片在后续点击时不会更改。

我尝试用文本而不是图像做同样的事情,这次显示的是猫的事实:

def get_cat_fact():
    x = requests.get('https://catfact.ninja/fact')
    st.text(x.text)

st.button("Click for cat facts", on_click = get_cat_fact())

它起作用了 - 每次单击按钮时文本都会改变。

有人知道这是为什么吗?如何让 Streamlit 刷新图像也一样?

可能 st.image() 正在缓存结果,这意味着无论何时您使用相同的输入参数调用它,它都会简单地获取与以前相同的结果。

你应该简单明了:

import requests

def show_kitty():
    image = requests.get("https://cataas.com/cat").content
    st.image(image)

st.button("Click for cats", on_click=show_kitty)

我认为正确的实现是:

import requests

def show_kitty():
    image = requests.get("https://cataas.com/cat").content
    st.image(image)

if st.button("Click for cats"):
    show_kitty()

你必须像UI的主要规范一样考虑稀疏代码,如果你需要进入回调你可以改变全局变量(example here)的状态而不直接改变元素UI。我认为这是最佳做法。