Streamlit入门
1、Streamlit是什么
Streamlit 是一个用于快速构建数据应用的开源 Python 库,由 Streamlit 公司开发并维护。它极大地简化了从数据脚本到交互式 Web 应用的转化过程,让开发者无需具备前端开发的专业知识,就能轻松创建出美观、实用的交互式应用。
Streamlit≈前端框架+后端框架+云服务器
2、基本使用方法
基本组件
1、pip install streamlit
2、测试是否安装成功:streamlit hello(一个示例网页)
如果没有立即自动跳转到网页,而是像这样:
则再在Email行输入回车即可
3、import streamlit as st
4、运行自定义网页,streamlit run .\test1.py(streamlit run + Python脚本的路径)
5、终止服务器,按ctrl+C即可
6、点击网页右上角的rerun,让代码改动在网页上生效;
Always rerun可以一边修改代码,一边生效(要手动保存后)。
import streamlit as st
import pandas as pd
# 可以传markdown语法的参数
st.write("### 新年快乐")
# 省略.write也可以直接打印
123
a=10
a
[11,22,33]
{"a":"1","b":"2","c":3}
# 大标题
st.title("我的个人网站💡")
# 图片
st.image("E:\streamlit\source\image.png",width=300)
# 表格
data={ #创建一个包含学生信息的字典(键是列名)
'姓名': ['张三', '李四', '王五'],
'年龄': [20, 21, 22],
'成绩': [85, 90, 78]
}
df=pd.DataFrame(data) #使用字典创建DataFrame
st.dataframe(df) #显示表格,直接写df也可以————交互式表格
df
st.divider() #分割线
st.table(df) #非交互式静态表格
import streamlit as st
# 文字输入
name = st.text_input("请输入你的名字:")
if name:
st.write(f"你好,{name}")
st.divider()
# 将text_input的type值定为password,就是输入密码了
password=st.text_input("请输入密码:",type="password")
st.divider()
# 输入长文本,要用到大区域,可以手动调节文本框的长度
paragraph = st.text_area("请输入你的自我介绍:")
st.divider()
# 数字输入
age=st.number_input("请输入你的年龄:",value=20,min_value=0,max_value=150,step=1)
st.write(f"你的年龄是:{age}岁")
st.divider()
# 勾选框
checked = st.checkbox("我同意以上条款") # 勾选了就返回true,否则是false
if checked:
st.write("感谢您的同意!")
st.divider()
# 按钮
submitted = st.button("提交")
if submitted:
st.write("提交成功!")
streamlit什么时候会重新运行整个文件呢?
1、对源代码进行修改后
2、用户与组件进行了交互后(比如输入文本并回车,点击了按钮,拖动了滑块),
文件就会从头到尾重新运行,从而对里面的一些变量值进行更新
注意:使用number_input时,将step设置为1,就限制了输入值最终只能是整数
number_input的另一个参数:
import streamlit as st
# 单选按钮
gender = st.radio("你的性别是什么",
["男性","女性","跨性别"], #options选项:可迭代对象,列表或元组
index=None) #index设置初始选中的选项索引,默认为0,设置等于None值时无初始设置
if gender:
st.write(f"你选择的性别是{gender}")
st.divider()
# 单选框
contact = st.selectbox("你希望通过什么方式联系?",
["微信","QQ","邮箱","电话","其它"])
st.write(f"好的,我们会通过{contact}联系你")
st.divider()
# 多选框
fruits = st.multiselect("你喜欢的水果是什么?",
["苹果","西瓜","橙子","香蕉"]) #返回的是选中元素组成的列表
for fruit in fruits:
st.write(f"你选择的水果是{fruit}")
st.divider()
# 滑块(通过拖动来选择数字)
height = st.slider("你的身高是多少厘米?",value=160.0,
min_value=100.0,max_value=230.0,step=0.5)
st.write(f"你的身高是{height}厘米")
st.divider()
# 文件上传器
uploaded_file = st.file_uploader("请上传你的文件",
type=["py"]) #type参数限制了可以上传的文件类型,"py"表示python代码文件
## 如果用户没有上传文件,uploaded_file 的值为 None;如果用户上传了文件,uploaded_file 是 UploadedFile 类的一个实例,该实例包含了上传文件的相关信息,如文件名、文件内容等。
if uploaded_file:
st.write(f"你上传的文件是{uploaded_file.name}")
st.write(f"文件内容如下:{uploaded_file.read().decode('utf_8')}")
## uploaded_file.read() 是 UploadedFile 类的一个方法,用于读取上传文件的内容。该方法返回一个字节字符串(bytes 类型),表示文件的二进制内容。
## 由于 uploaded_file.read() 返回的是字节字符串,如果文件是文本文件,在显示时可能需要进行解码操作,例如使用 uploaded_file.read().decode('utf-8') 将字节字符串解码为 Unicode 字符串,以确保中文等非 ASCII 字符能够正确显示。
布局
侧边栏和列
import streamlit as st
# 侧边栏
with st.sidebar:
name = st.text_input("请输入你的名字:")
if name:
st.write(f"你好,{name}")
# 多列布局
# (column1,column2,column3) = st.columns(3) 将布局划分为三列,并且将这三列分别赋值给变量 column1、column2 和 column3
(column1,column2,column3) = st.columns([1,2,1]) #当st.columns()的参数是一个数字列表时,列表中的每个元素代表对应列的相对宽度
# 第一列里有什么(有缩进的才是):
with column1:
password=st.text_input("请输入密码:",type="password")
with column2:
paragraph = st.text_area("请输入你的自我介绍:")
with column3:
age=st.number_input("请输入你的年龄:",value=20,min_value=0,max_value=150,step=1)
st.write(f"你的年龄是:{age}岁")
st.divider()
checked = st.checkbox("我同意以上条款")
if checked:
st.write("感谢您的同意!")
st.divider()
submitted = st.button("提交")
if submitted:
st.write("提交成功!")
选项卡和折叠展开
import streamlit as st
# 创建标签页界面的函数。它接收一个列表作为参数,列表中的每个元素代表一个标签页的标题。
# 返回值是一个包含多个标签页对象的元组
(tab1,tab2,tab3) = st.tabs(["性别","联系方式","喜好水果"])
with tab1:
gender = st.radio("你的性别是什么",
["男性","女性","跨性别"],
index=None)
if gender:
st.write(f"你选择的性别是{gender}")
with tab2:
contact = st.selectbox("你希望通过什么方式联系?",
["微信","QQ","邮箱","电话","其它"])
st.write(f"好的,我们会通过{contact}联系你")
with tab3:
fruits = st.multiselect("你喜欢的水果是什么?",
["苹果","西瓜","橙子","香蕉"])
for fruit in fruits:
st.write(f"你选择的水果是{fruit}")
st.divider()
# 折叠展开组件:展示非关键信息,平时折叠,需要时展开,提高页面上的信息展示效率
# with st.expander("展开区域标题"):
with st.expander("身高信息"):
height = st.slider("你的身高是多少厘米?",value=160.0,
min_value=100.0,max_value=230.0,step=0.5)
st.write(f"你的身高是{height}厘米")
st.divider()
uploaded_file = st.file_uploader("请上传你的文件",
type=["py"])
if uploaded_file:
st.write(f"你上传的文件是{uploaded_file.name}")
st.write(f"文件内容如下:{uploaded_file.read().decode('utf_8')}")
会话状态
当我们打开一个新的浏览器标签,进入到这个网页,就是一个新的会话。关闭标签,会话才结束。
会话状态可以保留和共享用户会话中的变量,只要用户没有关闭标签,会话中的状态就可以被保留。
import streamlit as st
if "a" not in st.session_state: # 如果a还没在会话状态中
st.session_state.a=0 # 则把a加入会话状态,并赋值为0
clicked = st.button("加1")
if clicked:
st.session_state.a += 1
st.write(st.session_state.a)
print(st.session_state) #{'a': 10}
多页面网站
把多个页面归在同一个网站,而不是每个页面单独一个网站
1、选择其中一个页面作为主页(比如page1.py)
2、把剩下的页面移动到pages文件夹下,必须叫pages
3、streamlit run page1.py即可