Streamlit库的动态刷新效果

最近做项目用streamlit做demo,感觉研究出了新用法

大多数的st项目都是静态的,即使有组件可以给你搭建监控栏。

研究出来了一个可以动态刷新后台数据的方法

其实不能和真的刷新效果媲美,但是可以当做下位替代

并且应该也有人想到了,只是社区内容真心不多

下代码是一个最小用例

import streamlit as st
import time
import random
if 'count' not in st.session_state:#初始化一个计数器
st.session_state.count=0
temp=st.session_state.count
st.session_state.count+=random.random()%1 #随机+0-1
st.metric(label="计数", value=st.session_state.count,delta=round(st.session_state.count-temp,2))
if st.session_state.count>=10:
st.error('计数达到10,程序结束')
st.stop()
time.sleep(1) #每秒刷新一次

st.rerun()

这个方法有个问题,比如你在页面上显示的东西从后端数据库中消失了(因为你的操作)

那么会留下容器残留(你可能看见的形式就是容器变灰了)

有个解决办法:

新建一个空白页blank.py

import streamlit as st
#这是什么页面?
#天才的想法,由于st有缓存,删除的评论会留下一个容器未被装填,而重新加载一下这个页面没作用
#把这个页面作为跳转页面,根本看不出来是两个页面hhh
st.switch_page(f"./pages/{st.session_state.previouspage}")

比如你上一个页面是example.py

则在跳转前利用st.session_state.previouspage记录下当前页面example.py

st.session_state.previouspage='example.py'
st.switch_page('./pages/blank.py')

看到的效果是:

  1. 页面操作后容器灰了一下
  2. 跳转到了一个白页面
  3. 马上又显示了原本的页面,且没有原本的容器残留

跳转速度是很快的

后记

现在在研究直接插入的html元素能否与后端交互。

目前的查询表示是不行的,即使有按钮,该按钮也不能和python的后端

st_tweaker这个库可以算是解决了这一痛点,可以写css了

后续看看能不能js交互

或者发现一个组件竟然能够监控点击状态

有研究的也可以给我发发邮件QAQ