Streamlit:如何将变量的值存储在缓存中

Posted

技术标签:

【中文标题】Streamlit:如何将变量的值存储在缓存中【英文标题】:Streamlit: How to store value of variable in cache 【发布时间】:2021-02-18 06:03:47 【问题描述】:

我正在使用 2 个不同的无线电选项来执行不同的任务。我想从一个中捕获图像,然后稍后在选项 2 中执行一些操作。当我在将帧存储在 my_image(在选项 1 中)后尝试将单选选项更改为 2 时,thre streamlit 出现错误NameError: name 'my_image' is not defined。我在想可以通过将变量my_image 存储在缓存中来完成,但我不知道该怎么做。有没有其他方法可以做到这一点。

import streamlit as st
import cv2

def Camera():
    frames1 = st.empty()
    button1 = st.button('DONE', key=0)
    while cap.isOpened():
        frames1.image(cap.read()[1], channels="BGR")
        if button1:
            my_image = cap.read()[1]
            cap.release()
            break
    return my_image

option = st.sidebar.radio('Choose the option', [1, 2])

if option == 1:
    cap = cv2.VideoCapture(0)

    my_image = Camera()
    st.image(my_image, channels="BGR")

if option == 2:
    st.image(my_image, channels='BGR')

【问题讨论】:

【参考方案1】:

我猜我需要将这个SessionState gist 复制到 SessionState.py 文件中。 我初始化了一个变量session_state = SessionState.get(name='', img=None)。 在option==1中,赋值session_state.img = my_image,然后用它在option==2中得到my_image

import streamlit as st
import cv2
import SessionState

def Camera():
    frames1 = st.empty()
    button1 = st.button('DONE', key=0)
    while cap.isOpened():
        frames1.image(cap.read()[1], channels="BGR")
        if button1:
            my_image = cap.read()[1]
            cap.release()
            break
    return my_image


option = st.sidebar.radio('Choose the option', [0, 1])
session_state = SessionState.get(name='', img=None)
if option == 0:
    cap = cv2.VideoCapture(0)

    my_image = Camera()
    st.image(my_image, channels="BGR")
    session_state.img = my_image

if option == 1:
    my_image = session_state.img
    st.image(my_image, channels='BGR')

【讨论】:

我相信 SessionState 只保留当前用户的值,因此如果您想在访问您的应用的多个用户之间保留它,这可能行不通【参考方案2】:

每次有交互事件时,Streamlit 都会自上而下运行。在您的代码中,my_image = Camera() 仅在 option==0 时运行;当单选按钮切换到另一个选项时,my_image 永远不会被定义。

将定义capmy_image 的代码移出您的第一个条件语句。

【讨论】:

实际上我为不同的页面使用了不同的单选按钮。我想捕捉图像,然后在完全不同的环境中对图像执行一些任务。

以上是关于Streamlit:如何将变量的值存储在缓存中的主要内容,如果未能解决你的问题,请参考以下文章

如何在缓存结果时更新非局部变量?

Streamlit 缓存 Keras 训练模型

将文件的文件大小存储在变量 Streamlit 中

NLog:如果多次使用,具有缓存布局的变量会产生不同的值

如何在流光中缓存绘图?

计算属性取决于 vuex 存储。如何更新缓存的值?