You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:50:33