Skip to content

Streamlit安装与入门

Streamlit

介绍

Streamlit 是一个用于快速构建和分享数据科学、机器学习(ML)Web 应用的 Python 库。它的核心特点是简单易用,允许开发者通过纯 Python 代码快速将数据脚本转换为交互式 Web 应用,无需前端开发经验(如 HTML、CSS、JavaScript 等)。适用场景:

  • 快速原型开发(数据工具、ML 模型演示)
  • 数据探索与可视化报告
  • 内部工具或团队协作应用
  • 教学演示、学术分享等

安装

shell
pip install streamlit

打开示例网页:streamlit hello

运行代码:streamlit run a.py 。运行后,刷新网页可以看到新内容

基础API

基础布局与文本展示

  • st.title("标题"):一级标题
  • st.header("小标题"):二级标题
  • st.subheader("子标题"):三级标题
  • st.text("普通文本"):纯文本
  • st.markdown("**Markdown 文本**"):支持 Markdown 格式(如加粗、列表、链接等)
  • st.caption("说明文字"):小标题 / 注释(字体较小)
  • st.code("print('代码块')", language="python"):代码块(支持语法高亮)
  • st.write:智能展示多种内容(万能函数)

交互组件

python
import streamlit as st

# 文本输入
name = st.text_input("请输入姓名", placeholder="例如:张三")  # 返回字符串

# 数字输入
age = st.number_input(
    "请输入年龄", min_value=0, max_value=120, value=18
)  # 返回整数/浮点数

# 滑块
score = st.slider("评分", min_value=0, max_value=10, value=5, step=1)  # 返回数值

# 复选框
agree = st.checkbox("同意条款")  # 返回布尔值(True/False)

# 单选框 / 下拉选择
# 单选框
gender = st.radio("性别", options=["男", "女", "保密"])  # 返回选中的选项
# 下拉选择
city = st.selectbox("城市", options=["北京", "上海", "广州"])

# 多选框
hobbies = st.multiselect("爱好", options=["阅读", "运动", "游戏"])  # 返回选中选项的列表

# 按钮
if st.button("点击提交"):
    st.success("提交成功!")  # 点击后执行操作

# 文件上传
file = st.file_uploader(
    "上传文件", type=["csv", "xlsx"]
)  # 返回上传的文件对象(需结合 Pandas 读取)

数据与图表展示

python
### 数据表格
import pandas as pd
df = pd.DataFrame({"姓名": ["张三", "李四"], "年龄": [20, 25]})
st.dataframe(df)  # 交互式表格(支持排序、筛选)
st.table(df)      # 静态表格(不支持交互)


### 图表展示(支持 Matplotlib、Plotly、Altair 等)
import matplotlib.pyplot as plt
import seaborn as sns

# Matplotlib 图表
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 1])
st.pyplot(fig)  # 显示 Matplotlib 图表

# Seaborn 图表(基于 Matplotlib)
fig = sns.barplot(x=["A", "B"], y=[10, 20]).get_figure()
st.pyplot(fig)

# Plotly 交互式图表
import plotly.express as px
fig = px.scatter(df, x="年龄", y="分数")  # 假设 df 有"分数"列
st.plotly_chart(fig)  # 显示 Plotly 图表(支持缩放、悬停)


### 数据统计
st.metric(label="温度", value="25°C", delta="+2°C")  # 显示指标卡(带变化量)

布局与状态API

布局与容器:用于组织页面结构(如分栏、折叠面板等)。

python
import streamlit as st

# 分栏
col1, col2 = st.columns(2)  # 分成 2 列
with col1:
    st.text("第一列内容")
with col2:
    st.text("第二列内容")

# 折叠面板
with st.expander("点击展开详情"):
    st.write("隐藏的详细内容...")

# 侧边栏
# 所有组件放在 st.sidebar 中会显示在侧边栏
st.sidebar.text_input("侧边栏输入")
st.sidebar.button("侧边栏按钮")

# 容器(灵活控制渲染顺序)
container = st.container()
container.write("容器内内容 1")
st.write("容器外内容")
container.write("容器内内容 2")  # 会跟在"内容 1"后面

状态与反馈:用于管理应用状态或向用户反馈操作结果。

python

### 状态管理(st.session_state,跨组件共享数据)
# 初始化状态
if "count" not in st.session_state:
    st.session_state.count = 0
# 点击按钮更新计数
if st.button("+1"):
    st.session_state.count += 1
st.write(f"当前计数:{st.session_state.count}")


### 反馈提示
st.success("操作成功!")  # 绿色成功提示
st.error("操作失败!")  # 红色错误提示
st.warning("注意:即将超时")  # 黄色警告提示
st.info("信息:请上传文件")  # 蓝色信息提示

### 进度条与 spinner
import time

# 进度条
progress_bar = st.progress(0)
for i in range(100):
    time.sleep(0.05)
    progress_bar.progress(i + 1)

# 加载动画
with st.spinner("正在处理..."):
    time.sleep(3)  # 模拟耗时操作
st.success("处理完成")

其他常用功能API

  • 页面配置(需放在代码最顶部)
python
st.set_page_config(
    page_title="我的应用",  # 浏览器标签页标题
    page_icon="📊",        # 图标(emoji 或图片路径)
    layout="wide"          # 宽屏模式(默认"centered")
)
  • 缓存@st.cache_data,加速重复计算):
python
@st.cache_data  # 缓存函数结果,避免重复计算
def load_data(file):
    return pd.read_csv(file)

df = load_data("large_file.csv")  # 第一次加载后缓存,后续直接读取

聊天API

st.chat_message(展示聊天消息)

  • 用于展示聊天消息气泡,支持区分用户("user")和助手("assistant")角色

st.chat_input(获取用户输入)

  • 配套的输入框组件,专门用于聊天场景,返回用户输入的字符串
  • 会固定显示在页面底部(类似聊天软件的输入框),不受其他组件的布局影响(即使写在代码中间,也会渲染在底部)

st.session_state(保存对话历史)

  • 聊天应用需要保存历史消息,st.session_state 是全局状态容器,可用于存储对话列表。
python
import streamlit as st

# 展示用户消息
with st.chat_message("user"):
    st.write("你好!")  # 用户发送的内容

# 展示助手消息
with st.chat_message("assistant"):
    st.write("你好!有什么可以帮你的吗?")  # 助手回复的内容
    
### 输入
user_input = st.chat_input("请输入消息...")  # 输入框占位符
if user_input:  # 当用户输入内容后
    st.write(f"你输入了:{user_input}")
    
### 对话历史
# 首次运行时初始化对话历史(列表中每个元素是字典,包含角色和内容)
if "messages" not in st.session_state:
    st.session_state.messages = []