Skip to content

建立 2026-09-14 更新 2026-09-14

重新執行模型

Streamlit 跟 Flask、Django 不一樣:它沒有你手寫的路由與回呼迷宮。你寫的是一支由上往下執行的 Python 腳本。畫面要更新時,這支腳本會再跑一次。

什麼時候會重跑?

  1. 你儲存了原始碼。
  2. 使用者操作 Widget:拖滑桿、按按鈕、選下拉選單、輸入文字。

每次重跑都是乾淨的一次執行。普通的 Python 變數會回到初始值,所以下面的計數器不會累加

import streamlit as st

counter = 0
if st.button("加一"):
    counter += 1
st.write(counter)  # 永遠是 0 或 1

要記住次數,必須用 Session State。讀大檔或載入模型則要用 快取,否則每次拖滑桿都會重做昂貴計算。

Callback 何時執行?

Widget 若設了 on_changeon_click,callback 會在腳本其餘部分之前先跑。這讓你能在重跑前先改 Session State,例如兩個輸入欄互相換算單位。細節見官方 Session State 影片

flowchart TD
  A[使用者操作 Widget] --> B{有 callback?}
  B -->|有| C[先執行 on_click / on_change]
  B -->|沒有| D[從頭執行整支腳本]
  C --> D
  D --> E[依最新 Widget 值重畫畫面]

為什麼這個設計很重要?

因為你可以像寫 Jupyter notebook 或分析腳本一樣寫 App:讀資料、畫圖、加篩選器。不必管理前端狀態樹。代價是:任何要跨互動存活的東西,都要明確放進 Session State 或快取。

這是 Streamlit 最核心的 20% 觀念。後面幾乎所有「為什麼按鈕沒作用」的問題,都從這裡開始解。