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也可以直接打印
123a=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) #使用字典創建DataFramest.dataframe(df) #顯示表格,直接寫df也可以————交互式表格
dfst.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 stif "a" not in st.session_state: # 如果a還沒在會話狀態中st.session_state.a=0 # 則把a加入會話狀態,并賦值為0clicked = 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即可