# Streamlit
*written by candySad*
特别面向机器学习的python webapp框架,方便快捷的用python脚本搭建webapp
### 写在前面
Streamlit基于python脚本文件来实现网页应用,本质上,是在整个python脚本上不断重复从头运行到结尾的过程
这意味着,两个if...else分支中的部分是完全隔离,且通过按钮等方式运行一个又运行另一个时,其中一个的作用将完全不会对另一个分支产生任何影响,实际上Streamlit是从if...else语句的开头从新运行了这部分代码直到下一个暂停点
比如,点击第一个按钮使得if...else进入第一个分支修改一个全局变量tmp的值(初始为 0),使其自增 1,随后点击另一个按钮进入另一个分支,使tmp再次自增 1,最终tmp的值会是 1,因为两个分支最终只会运行一个,即第二个分支,第一个分支的操作会被Streamli回滚而取消
另外,所有可交互的组件如按钮和勾选框,对其进行一次交互只是修改了一次它的状态,与其绑定的on_click函数仅在其被激活的状态下运行一次,其没有激活时(按钮点击一次后,点击其他交互组件即会自动退回未激活状态)与其绑定的on_click函数就会回撤而变为未运行过的状态
因此,基于Streamlit的这种从前到后的脚本运行的特性,很多应用程序的编写逻辑可能与其他框架不同,当需要对某个数据反复修改时,需要考虑使用外部存储的方法
**这部分的一些详细例子将留在[最后](##使用说明)**
### 文档说明
本文档参照官方文档翻译总结
本文档的实例演示在同路径下
本项目结构
- `streamlit.md`:文档本身
- `example.py`:实例演示
- `mdimage`:文档图片
- `icon`:实例演示的webapp的icon
- `data`:实例演示中使用的媒体文件
缺失部分
- [图表显示组件](###图表)
- [Streamlit Components编写](####bi-directional component)
- [Streamlit Cloud](###Streamlit Cloud)
- [数据库连接](###数据库)
### 版本
本文档参照官方API文档版本**v1.2.0**编写
### 安装
```powershell
pip install streamlit
```
### 命令行指令
#### 启动streamlit的webapp服务
```powershell
streanlit run example.py
```
#### 命令行中的设置
```powershell
streamlit run your_script.py [-- script args]
```
例:
```
streamlit run your_script.py --server.port 80
```
使用`Ctrl`+`C`来停止应用程序
#### 查看文档
```
streamlit docs
```
#### 清除cache
```
streamlit cache clear
```
### import
```python
import streamlit as st
```
------
### 显示内容
#### st.write
```python
st.write(*args, **kwargs)
```
- 将传入的内容显示在页面中
- 对换行效果没有很好的支持,换行符会被显示为一个空格
- **args** (any)
- write(string)
- write(data_frame): 将data_frame显示为表格
- write(error)
- write(func) :显示一个函数的相关信息
- write(module)
- write(dict) :
- write(mpl_fig)
- write(altair)
- write(keras)
- write(graphviz)
- write(plotly_fig)
- write(bokeh_fig)
- write(sympy_expr)
- write(htmlable)
- write(obj)
- unsafe_allow_html (bool)
- 默认为False,会将参数中的html标签的内容渲染为纯文本
- 设置为True则会渲染其中的html标签
- 效果并不好,需要在页面中设置html代码部分应参照[Components API](####st.components.v1.html)
#### magic
把你要写的内容直接写在py脚本里,markdown或数据或图都行,streamlit会把它们渲染出来
将文本内容以多行注释的方式写出来
```python
# Draw a title and some text to the app:
'''
# This is the document title
This is some _markdown_.
'''
import pandas as pd
df = pd.DataFrame({'col1': [1,2,3]})
df # 👈 Draw the dataframe
x = 10
'x', x # 👈 Draw the string 'x' and then the value of x
# Also works with most supported chart types
import matplotlib.pyplot as plt
import numpy as np
arr = np.random.normal(1, 1, size=100)
fig, ax = plt.subplots()
ax.hist(arr, bins=20)
fig # 👈 Draw a Matplotlib chart
```
- **当前magic功能仅能够在main文件中运行**
- magic功能默认开启,需要关闭则查看[相关设置](#####指令:查看所有设置)
------
### 文本元素
#### st.markdown
```python
st.markdown(body, unsafe_allow_html=False)
```
- Markdown
- **body**(str)
- 按照[GFM](https://github.github.com/gfm)的标准渲染Markdown
- 支持[github标准](https://raw.githubusercontent.com/omnidan/node-emoji/master/lib/emoji.json.)的emoji
- 支持用\$或\$\$括起的$\LaTeX$公式,用[KaTeX](https://katex.org/docs/supported.html)渲染
- unsafe_allow_html (bool)
#### st.title
```python
st.title(body, anchor=None)
```
- 标题
- **body**(str)
- 显示的内容
- **anchor**(str)
- 设置该标题的锚点名称,不设置则为空
- 锚点用于页面内跳转定位
#### st.header
```python
st.header(body, anchor=None)
```
- 头
- **body**(str)
- 显示的内容
- **anchor**(str)
- 设置该标题的锚点名称,不设置则为空
- 锚点用于页面内跳转定位
#### st.subheader
```python
st.subheader(body, anchor=None)
```
- 子头
- **body**(str)
- 显示的内容
- **anchor**(str)
- 设置该标题的锚点名称,不设置则为空
- 锚点用于页面内跳转定位
#### st.caption
```python
st.caption(body)
```
- 小号字体
- **body**(str)
- 显示的内容
#### st.code
```
st.code(body, language="python")
```
- 代码块
- **body**(str)
- 显示的内容
- **language**(str)
- 代码语言类型
#### st.text
```python
st.text(body)
```
- 纯文本
- **body**(str)
- 显示的内容
#### st.latex
```python
st.latex(body)
```
- latex公式
- **body**(str)
- 显示的内容
------
### 数据显示类型
#### st.dataframe
```python
st.dataframe(data=None, width=None, height=None)
```
- 显示可行的数据框架
- **data**(pandas.DataFrame, pandas.Styler, pyarrow.Table, numpy.ndarray, Iterable, dict, or None)
- dict实际上不能用
- **width**(int or None)
- 宽度
- **height**(int or None)
- 高度
#### st.table
```python
st.table(data=None)
```
- 显示一张静态表
- **data**(pandas.DataFrame, pandas.Styler, pyarrow.Table, numpy.ndarray, Iterable, dict, or None)
st.metric
```python
st.metric(label, value, delta=None, delta_color="normal")
```
- 单位数据
- **label**(str)
- 数据标签/标签
- **value**(int, float, str, or None)
- 数据的值
- **delta**(int, float, str, or None)
- 显示该数据的变化情况
- 如果delta的值是负数或str的开头有`-`,则会有向下的红色箭头
- 如果delta的值是正数,则会有向上的绿色箭头
- **delta_color** (str)
- 设置delta的颜色
- 默认为 "normal"
- 可以设置为
- normal:上绿下红
- inverse:上红下绿
- off:灰色
#### st.json(body)
```python
st.json(body)
```
- 将一个对象或一个字符串内容显示为json格式
- **body**(Object or str)
- 要显示的内容
------
### 图表
[待施工](https://docs.streamlit.io/library/api-reference/charts#chart-elements)
------
### 输入组件
#### st.button
```python
st.button(label,
key=None, help=None,
on_click=None, args=None,
kwargs=None)
```
- 按钮
- 返回值为bool类型
- 创建时返回值为Fasle
- 按下时返回值为True
- 操作其他组件后返回值自动变回False
- **label**(str)
- 显示在按钮上的字
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在按钮上时的提示内容
- **on_click**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_click的tuple参数
- **kwargs**(dict)
- 传给on_click的dict参数
#### st.download_button
```python
st.download_button(label, data,
file_name=None, mime=None,
key=None, help=None,
on_click=None, args=None,
kwargs=None)
```
- 下载按钮
- 返回值为bool类型
- 创建时返回值为Fasle
- 按下时返回值为True
- 操作其他组件后返回值自动变回False
- **label**(str)
- 显示在按钮上的字
- **data**(str or bytes or file)
- 下载的内容
- **file_name**(str)
- 设定下载文件下载时的文件名
- **mime**(str or None)
- 文件的MIME类型
- 自动为data的str类型设置为text
- 自动为data的bytes或二进制文件类型设置为应用或八进制流
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在按钮上时的提示内容
- **on_click**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_click的tuple参数
- **kwargs**(dict)
- 传给on_click的dict参数
#### st.checkbox
```python
st.checkbox(label,
value=False, key=None,
help=None, on_change=None,
args=None, kwargs=None)
```
- 勾选列表
- 仅一个选项选项
- ```python
a = st.checkbox('test_checkbox', value=False, key=None, help="testing", on_change=None, args=None, kwargs=None)
```
- 返回值为bool类型
- 创建时返回值为指定的值,缺省则默认为False
- 勾选时返回值为True
- 不勾选时返回值为False
- **label**(str)
- 显示在按钮上的字
- **value**(bool)
- 预设该选项的勾选情况
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.radio
```python
st.radio(label, options, index=0,
format_func=special_internal_function,
key=None, help=None,
on_change=None, args=None,
kwargs=None
)
```
- 单选框
- ```python
genre = st.radio(label="What's your favorite movie genre",options = ('Comedy', 'Drama', 'Documentary'))
```
-
- 返回值为选定的选项内容
- **label**(str)
- 显示在标题上的字
- **options**(Sequence, numpy.ndarray, pandas.Series, pandas.DataFrame, or pandas.Index)
- 选项
- 默认为str类型
- 不指定时创建时默认选择第一个(最开始的一个)
- **index**(int)
- 创建时默认选择第几个选项
- 自0开始
- **format_func**(function)
- 设置选项的格式
- 修改选项的标签内容
- 对该多选框的返回值无影响
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在❔上时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.selectbox
```python
st.selectbox(label, options,
index=0,
format_func=special_internal_function,
key=None, help=None,
on_change=None, args=None,
kwargs=None
)
```
- 下拉单选
- ```python
st.selectbox('slectbox',('Comedy', 'Drama', 'Documentary'))
```
-
- 返回值为选定的选项内容
- **label**(str)
- 显示在标题上的字
- **options**(Sequence, numpy.ndarray, pandas.Series, pandas.DataFrame, or pandas.Index)
- 选项
- 默认为str类型
- 不指定时创建时默认选择第一个(最开始的一个)
- **index**(int)
- 创建时默认选择第几个选项
- 自0开始
- **format_func**(function)
- 设置选项的格式
- 修改选项的标签内容
- 对该多选框的返回值无影响
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.multiselect
```python
st.multiselect(label, options,
default=None,
format_func=special_internal_function,
key=None, help=None,
on_change=None, args=None,
kwargs=None
)
```
- 下拉多选
- ```python
st.multiselect('multiselect',('Comedy', 'Drama', 'Documentary'), default=None)
```
-
- 返回值类型为List,内容由选择的项组成
- **label**(str)
- 显示在标题上的字
- **options**(Sequence, numpy.ndarray, pandas.Series, pandas.DataFrame, or pandas.Index)
- 选项
- 默认为str类型
- 不指定时创建时默认选择第一个(最开始的一个)
- **default** ([str] or None)
- 创建时默认选择哪几个选项
- **format_func**(function)
- 设置选项的格式
- 修改选项的标签内容
- 对该多选框的返回值无影响
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.slider
```python
st.slider(label,
min_value=None, max_value=None,
value=None, step=None,
format=None, key=None,
help=None, on_change=None,
args=None, kwargs=None
)
```
- 拉动条
- ```python
st.slider(label="slider", min_value=-10, max_value=10, value=0, step=1, help="testing!")
```
-
- 返回值为当前选择的数值
- **label**(str)
- 显示在标题上的字
- **min_value**(a supported type or None)
- 最小值
- **max_value**(a supported type or None)
- 最大值
- **value**(a supported type or a tuple/list of supported types or None)
- 创建时的默认值
- 不指定时默认时最小值
- **step**(int/float/timedelta or None)
- 每次拉动的变化量
- 对于整型,默认为1
- 对于浮点型,默认为0.01
- 对于时间类型,默认为1 timedealt
- 对日期则是1day
- 对时刻则是15分钟
- 或max_value - min_value < 1 day时是整个time
- **format**(str or None)
- 显示数字的格式
- 对于整型int或浮点型float支持:%d %e %f %g %i
- 对时间类型支持[Moment.js标准](https://momentjs.com/docs/#/displaying/format/)
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.select_slider
```python
st.select_slider(label,
options=[], value=None,
format_func=special_internal_function,
key=None, help=None,
on_change=None, args=None,
kwargs=None
)
```
- 选择滑动条
- ```python
st.select_slider(label='select_slider', options=[1,'test2',3], value=3, help="testing!")
```
- ![image-20211210215145569](mdimage/image-20211210215145569.png)
- 返回值为选择
- **label**(str)
- 显示在标题上的字
- **options**(Sequence, numpy.ndarray, pandas.Series, pandas.DataFrame, or pandas.Index)
- 选项
- 默认为str类型,每项类型可以不同
- 不指定时创建时默认选择第一个(最开始的一个)
- **value** (a supported type or a tuple/list of supported types or None)
- 创建时默认选择几个选项
- **format_func**(function)
- 设置选项的格式
- 将选中的选项作为参数传入function
- 输出会被转为str
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.text_input
```python
st.text_input(label,
value="", max_chars=None,
key=None, type="default",
help=None, autocomplete=None,
on_change=None, args=None,
kwargs=None, *, placeholder=None
)
```
- 文本输入框
- ```python
i = st.text_input(label='text_input', max_chars=30, value='test1', help='testing!', placeholder='请输入')
```
-
- 返回值是输入的内容
- 返回值是在一次完整输入后确认的
- **label**(str)
- 显示在标题上的字
- **value** (any)
- 创建时文本框中初始内容
- 会被转为str类型
- **max_chars**(int or None)
- 文本框接受的最长长度
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **type** (str)
- 文本框的类型
- ”default“:缺省时的默认值
- “password”:密码类型
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **autocomplete** (str)
- 自动完成属性
- 在html效果中为该组件提供自动完成属性
- 自动完成属性由浏览器识别到标签的该属性后提供
- 参考[MDN文档](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Attributes/autocomplete)
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
- **placeholder**(str or None)
- 未输入内容时在文本框中显示的内容
- 缺省时文本框无内容时不显示任何东西
- 未输入内容时返回值是null,而不是该值
#### st.number_input
```python
st.number_input(label,
min_value=None, max_value=None,
value=, step=None,
format=None, key=None,
help=None, on_change=None,
args=None, kwargs=None
)
```
- 数字选择框
- 返回值是当前显示的值
- ```python
st.number_input("number_input", min_value=-10, max_value=10, value=2, step=2, help="testing")
```
-
- **label**(str)
- 显示在标题上的字
- **min_value**(int or float or None)
- 接受的最小值
- **max_value**(int or float or None)
- 接受的最大值
- **value** (int or float or None)
- 创建时默认填入的值
- 缺省则默认填入min_value
- **step** (int or float or None)
- 单次变化的步长
- 整型int默认为1
- 浮点型默认为0.01
- 其他特定类型由format决定
- **format**(str or None)
- 设置数值的显示格式
- 可行的包括:%d %e %f %g %i %u
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.text_area
```python
st.text_area(label,
value="",
height=None, max_chars=None,
key=None, help=None,
on_change=None, args=None,
kwargs=None, *, placeholder=None
)
```
- 文本区域
- 显示多行文本的组件
- ```python
st.text_area("text_area", value="test1",max_chars=60, help="testing!", placeholder="请输入")
```
-
- **label**(str)
- 显示在标题上的字
- **value** (any)
- 创建时默认填入的值
- **height**(int or None)
- 创建出的ui高度
- **max_chars** (int or None)
- 最大可以接受的字符数
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
- **placeholder**(str or None)
- 未输入内容时在文本框中显示的内容
- 缺省时文本框无内容时不显示任何东西
- 未输入内容时返回值是null,而不是该值
- **placeholder**(str or None)
- 未输入内容时在文本框中显示的内容
- 缺省时文本框无内容时不显示任何东西
- 未输入内容时返回值是null,而不是该值
#### st.date_input
```python
st.date_input(label,
value=None,
min_value=None, max_value=None,
key=None, help=None,
on_change=None, args=None,
kwargs=None
)
```
- 日期选择框
- 选择或输入一个日期
- 返回值类型为datetime
- ```python
st.date_input(label="date_input")
```
-
- **label**(str)
- 显示在标题上的字
- **value**(datetime.date or datetime.datetime or list/tuple of datetime.date or datetime.datetime or None)
- 组件初始化时显示的值
- 允许用list或tuple提供一个包含0~2个date或datetime值的范围
- 缺省时默认为当前时间的单个值
- 此项为范围时,该组件变为范围选择,返回值类型与此项保持相同
- **min_value**(datetime.date or datetime.datetime)
- 可选择的最小值
- 缺省时默认为value往前数10年
- value为范围时,缺省该项则默认为范围左端点往前数10年
- **max_value**(datetime.date or datetime.datetime)
- 可选择的最大值
- 缺省时默认为value往后数10年
- value为范围时,缺省该项则默认为范围右端点往后数10年
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.time_input
```python
st.time_input(label,
value=None, key=None,
help=None, on_change=None,
args=None, kwargs=None
)
```
- 时间选择
- 选择或输入时间
- 该组件的时间不是日期,即时刻
- ```python
st.time_input("time_input", help="testing!")
```
-
- 返回值类型是datetime.time或datetime.datetime
- **label**(str)
- 显示在标题上的字
- **value**(datetime.time/datetime.datetime)
- 组件创建时的默认值
- 缺省时默认为当前时间
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.file_uploader
```python
st.file_uploader(label, type=None,
accept_multiple_files=False,
key=None, help=None,
on_change=None, args=None,
kwargs=None
)
```
- 上传按钮
- 默认上传文件的大小限制时200MB
- 更改上传功能的设置查看server.maxUploadSize等选项
- ```python
n = st.file_uploader(label='file_uploader', accept_multiple_files=True, help="testing!")
```
-
- 返回值是单个文件file或文件file组成的列表list
- **label**(str)
- 显示在标题上的字
- **type** (str or list of str or None)
- 上传允许的文件格式
- 单个字符串str或字符串str组成的列表list
- 缺省时默认为所有文件类型
- **accept_multiple_files**(bool)
- 是否允许同时上传多个文件
- 默认为Fasle
- 开启后,此组件的返回值为由文件组成的list
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
#### st.color_picker
```python
st.color_picker(label, value=None,
key=None, help=None,
on_change=None, args=None,
kwargs=None
)
```
- 拾色器
- 选择颜色
- 打开后可以使用16进制码或RGB或HSL输入
- ```python
st.color_picker('color_picker', '#00f900')
```
-
-
-
- **label**(str)
- 显示在标题上的字
- **value**(str)
- 默认值
- 十六位
- 缺省时默认值为黑色black
- **key**(str or int)
- 给一个组件设置的键,如果缺省此项则自动生成一个
- 多个同类组件会共享同一个键
- **help**(str)
- 鼠标悬停在上❔时的提示内容
- **on_change**(callable)
- 点击时触发的函数
- **args**(tuple)
- 传给on_change的tuple参数
- **kwargs**(dict)
- 传给on_change的dict参数
------
### 多媒体组件
#### st.image
```python
st.image(image,
caption=None, width=None,
use_column_width=None,
clamp=False, channels="RGB",
output_format="auto"
)
```
- 图片
-
- **image**(numpy.ndarray, [numpy.ndarray], BytesIO, str, or [str])
- (w,h) 或 (w,h,1)格式的黑白画
- (w,h,3)的彩色画
- (w,h,4)格式的RGBA画
- URL地址
- SVG XML标签,如:
```xml