streamlit笔记

streamlit笔记

下载与安装

需要电脑中有uv或pip包管理器.

powershell
若使用uv环境,使用这个命令.

uv pip install streamlit==1.32.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

什么是Streamlit?

Streamlit是什么呢?

Streamlit是一款开源Python框架,专为快速搭建前端界面打造,使用几行代码就可以交付动态数据应用.

开始使用

运行你的脚本

powershell
streamlit run <脚本名称> [-- script <参数列表>]

一些需要了解的东西

  1. 数据流

​ Streamlit会在以下情况下从头到尾重新运行整个脚本,实现页面的重新渲染.

- 修改程序源代码
- 与应用内控件交互,如拖动滑块,输入文字,点击按钮
  1. 魔法命令!?(了解)

    魔法! 可以在不调用任何Streamlit方法的情况下编写应用代码,完全不需要使用st.write()

    python
    """
    这里使用了魔法命令,创建了一个表格.
    """
    # 完全没有用到streamlit哦
    # import streamlit as st
    import pandas as pd
    
    df = pd.DataFrame({
        'first column': [1, 2, 3, 4],
        'second column': [10, 20, 30, 40]
    })
    
    # 这里有一个孤零零的df,实际上,这行代码等价于 st.write(df)
    
    df

Streamlit展示控件

显示标题

标题目前来说有三个等级,

python
import streamlit as st

# 一级标题通常只使用一次,用于创建最大,最显眼的标题,一般放置于页面顶部.
st.title("Hello,KuLve@一级标题")
# 二级标题可以使用多次,用于分隔不同的内容,如章节.
st.header("Hello,KuLve@二级标题")
# 三级标题可以使用多次,用于在更小的级别上标识内容.
st.subheader("Hello,KuLve@三级标题")

显示文本

有两种简易显示文本的方式,一种支持markdown语法,一种是原样输出

st.markdown(<文本>),支持markdown语法

st.text(<文本>),不支持markdown语法,原样输出.

python
import streamlit as st

# 这里支持MarkDown语法哦,text()是不支持的
st.markdown("""
# 静夜思
床前**明月**光,疑是地上霜。
举头望**明月**,低头思故乡。
""")
st.text("""
# 静夜思
床前**明月**光,疑是地上霜。
举头望**明月**,低头思故乡。
""")

显示代码块

用于显示代码块

语法: st.code(<代码>,language=<语言>)

python
import streamlit as st

# 显示一段代码
# 语法: st.code(<代码>,language=<语言>)
st.code("""
# main.py
# 示例使用,展示代码块
if __name__ == "__main__":
    # 测试数据
    example_list = [64, 34, 25, 12, 22, 11, 90]
    print(example_list)
""", language="python")

显示内容write()

这是一个通用的显示内容的方法

python
import streamlit as st

# 这是一个通用的显示内容的方法.
# 单参数
st.write("Hello,我是Yuili")
# 多参数,内容间以空格隔开
st.write("Hello", ",", "我是Yuili")
# 显示列表,会自动添加序号,从0开始.
st.write(["Hello", ",", "我是Yuili"])
# 显示字典
st.write({"key1": "Hello", "key2": ",", "key3": "我是Yuili"})

显示表格

这个示例使用了numpy生成了一些随机数据,用于展示.

python
import streamlit as st
import pandas as pd
import numpy as np

random_data_source = np.random.rand(2, 3)
df = pd.DataFrame(random_data_source, columns=['FiledA', 'FieldB', 'FieldC'])

# 动态表格
st.dataframe(df)

# 静态表格
st.table(df)

动态表格支持缩放,导出,滑动,查找,投影,高亮等操作.

静态表格则仅仅只是展示数据,没有任何其它功能.

显示json

json会以格式化方式输出,代码里即使只有一行,在这里也是有多行的.

python
import streamlit as st

st.json({
    'Key1': 'Value1',
    'Key2': 'Value2',
    'Key3': [
        'ListValue1',
        'ListValue2',
        'ListValue3',
        'ListValue5',
        'ListValue5',
    ],
})

显示图像

st.image(<文件名>)

这个语句可以加载一张多张图像,其在加载一张和多张图像时,行为不太相同,具体见代码.

图像源可以是numpy.ndarray,BytesIO,str,Path,list

python
import streamlit as st
from numpy.distutils.lib2def import output_def

st.image(".\\Robin.png",
         caption="我是一段说明文字",  # 这个方法只能用在单张图片上
         link="https://go.kulve.tech",  # 这个方法只能用在单张图片上
         # caption=None,
         # width=None,
         # use_column_width=False,
         # clamp=False,
         # channels='RGB'
         )

image_list = [
    ".\\Robin.png",
    ".\\Sunday.png",
    ".\\Robin.png",
    ".\\Sunday.png",
    ".\\Robin.png",
    ".\\Sunday.png",
    ".\\Robin.png",
    ".\\Sunday.png"
]
st.image(image_list,

         # 设置图片宽度,可设置的值有:
         #   - 整数(固定宽度)
         #   - "content"(根据内容自动调整宽度)
         #   - "stretch"(跟随父容器宽度)
         width=100,
         clamp=True,  # 仅针对字节数组有用,效果未知: 将像素值裁剪到[0,255]范围内,避免报错.
         channels='RGB',  # 仅针对字节数组有用,效果未知: 控制颜色通道顺序.
         # 指定传输给浏览器的图片格式
         # 可选值: "PNG"(无损压缩), "JPEG"(有损压缩), "auto"(自动)
         output_format="PNG"
         )

显示视频

视频源有两个,一个是本地视频源,一个是网络视频源

本地视频源暂时只能一次性加载到内存,一次性发送到客户端,不支持一点一点读取再发送,如果想要做类似的效果,可能需要将该视频资源直接作为静态资源对外暴露或者自己搭建HTTP服务器,将视频资源重定向到该地址.

python
import streamlit as st

video_file = open("Nikki.mp4", "rb")
video_bytes = video_file.read()

# 本地视频,本地视频需要先使用open打开,打开时,需要使用读取二进制模式.
# 本地视频不宜过大,因为需要一次性加载到内存中,这非常消耗内存.
st.video(video_bytes,format="mp4",start_time=2)
# 网络视频,直接给定地址就可以.
st.video("https://assets.papegames.com/resources/cdn/20260711/5320e0624b26823a.mp4")

Streamlit交互控件

按钮

按钮会返回一个boolean值,如果为true,则在上个生命周期中,按钮被点击了.

st.button("<提示语>") -> boolean

python
import streamlit as st

# button返回一个布尔值,用于检查上个应用生命周期中,按钮是否被点击.

if st.button("我是一个按钮,你不准点我"):
    st.write("被你点了,今天是个好日子.")

复选框

checkbox_var返回一个boolean值,True表示选中,False表示未选中

st.checkbox(“提示语”, value=<默认值>)

python
import streamlit as st

# checkbox_var返回一个boolean值,True表示选中,False表示未选中
checkbox_var = st.checkbox("好", value=True)

if checkbox_var:
    st.write("好")
else:
    st.write("还行")