如何在Streamlit中无闪烁更新/覆写列值?
解决Streamlit股票价格无闪烁更新问题
问题根源
- 原代码每次循环都创建新的
st.empty()容器,写完后清空,导致整体内容先消失再重新渲染,产生闪烁。 - 逐个请求股票价格并添加
time.sleep(0.5),导致最后一个价格的更新延迟累计放大。
解决方案
1. 预创建独立占位符
为每只股票的价格位置提前创建st.empty(),后续直接覆写对应占位符的内容,避免整体清除容器。
2. 批量获取股票数据
使用yfinance的批量查询接口,一次获取所有股票的价格,减少API调用次数和等待时间。
3. 定时批量更新价格
每次更新时,直接将新价格写入对应的预创建占位符,实现无闪烁覆写。
修改后的代码
import time import yfinance as yf import streamlit as st st.set_page_config(page_title="Test", layout='wide') stock_list = ['NVDA', 'AAPL', 'MSFT'] # 创建布局列(多余空白列按需保留或删除) left, right, *blank_cols = st.columns(12, gap='small') # 左侧展示股票代码 with left: for ticker in stock_list: st.write(ticker) # 右侧预创建每个价格对应的占位符 with right: price_placeholders = [st.empty() for _ in stock_list] # 批量获取并定时更新价格 while True: # 批量查询所有股票,减少API请求次数 tickers = yf.Tickers(' '.join(stock_list)) prices = [tickers.tickers[ticker].info['regularMarketPrice'] for ticker in stock_list] # 逐个覆写对应占位符内容,无闪烁更新 for placeholder, price in zip(price_placeholders, prices): placeholder.write(f": {price}") # 每秒更新一次(可按需调整间隔) time.sleep(1)
代码改进说明
- 预创建占位符:
price_placeholders列表存储每个价格位置的st.empty(),后续直接调用placeholder.write()覆写内容,不会清除整个容器,彻底解决闪烁问题。 - 批量API调用:
yf.Tickers()一次性查询多只股票,避免逐个请求的等待时间,解决最后一个价格延迟过长的问题。 - 定时批量更新:每次循环一次性获取所有价格,再逐个更新占位符,更新过程平滑,延迟均匀。
内容的提问来源于stack exchange,提问作者aps_s
相关产品推荐
相关产品推荐

