此示例使用 HTML + Canvas 實現滑動拼圖驗證碼。Canvas繪制帶隨機缺口的背景,獨立滑塊按鈕監聽滑鼠/觸摸拖拽,實時將滑塊位置映射到Ca...
Streamlit框架的定制化
本文摘要
Streamlit是一個專為機器學習和數據科學團隊設計的開源Python庫,旨在簡化Web應用的構建過程。它通過將Python腳本轉化為Web應用,實現即時反饋和組件化開發。Streamlit支持響應式編程,允許實時響應用戶操作,並提供了豐富的定制化選項,包括布局、狀態管理、主題和樣式等。開發者可以輕松整合第三方庫和插件,實現高級可視化。通過簡單的安裝和配置,即可快速運行和分享Streamlit應用。
一、Streamlit框架的定制化主要體現在以下幾個方面:
1. 布局定制:你可以使用Streamlit提供的布局組件如`st.sidebar`、`st.columns`、`st.container`等來定制你的應用界面。這些組件可以幫助你創建側邊欄、多列布局或容器,以便更好地組織和展示你的應用內容。同時,通過使用`with`關鍵字,你可以將特定組件添加到指定的容器中。
2. 狀態管理:Streamlit是一種狀態機,但有時你可能需要跨會話管理狀態。為此,你可以使用`SessionState`或`st.cache`等方法來管理狀態。這些方法可以幫助你在用戶與應用的交互過程中保存和恢復狀態,從而提升用戶體驗。

3. 主題和樣式定制:Streamlit允許你通過`st.set_page_config`來自定義頁面的標題、圖標、布局和主題顏色。這使你能夠根據你的品牌或應用需求來定制應用的外觀和風格。
4. 插件和整合:Streamlit提供了豐富的插件和整合功能,允許你整合第三方庫、API和插件來增強你的應用。例如,你可以整合地圖、圖表庫、數據源等,以豐富你的應用功能和內容。
5. 高級可視化定制:Streamlit對常見的圖表庫(如Matplotlib、Plotly)有很好的支持,你可以通過調整參數和樣式來創建高度定制化的可視化。這有助於你以直觀和吸引人的方式展示數據和分析結果。
Streamlit框架提供了多種定制化的選項,使你可以根據自己的需求來創建獨特且功能豐富的交互式Web應用。
二、什麽是streamlit?
Streamlit是一個開源的Python庫,專為機器學習和數據科學團隊設計的應用程序框架。它是第一個專門針對機器學習和數據科學的應用開發框架,旨在幫助開發者快速構建機器學習應用的用戶界面,而無需深入了解前端開發。
Streamlit的特點包括簡單易用的API、無需學習前端知識(如HTML、CSS、JavaScript)、自動化部署到雲上、提供豐富的組件如按鈕、滑塊、文本框等,並支持自定義主題。此外,Streamlit還廣泛支持Python數據科學庫,如Pandas、Numpy、Matplotlib、Scikit-Learn等。
總的來說,Streamlit是一個免費且開源的框架,可以快速構建和共享美觀的機器學習和數據科學Web應用程序,適合數據科學家或機器學習工程師使用。
三、Streamlit 的執行原理和流程
Streamlit的執行原理和流程主要基於其底層的Web服務器和前端渲染技術,以及與Python的集成。以下是其主要的執行原理和流程:
1. 底層原理:Streamlit的核心原理是將Python腳本轉化為Web應用程序。當你編寫Streamlit代碼時,實際上是在編寫一個Python腳本,其中包含了數據處理、可視化和用戶交互等代碼。當你運行這個腳本時,Streamlit會自動將這個腳本轉化為一個基於瀏覽器的交互式Web應用程序。
2. 即時性:Streamlit提供了即時反饋的特性。每次你更改代碼後,Streamlit會自動重新加載應用程序,並在瀏覽器中實時顯示結果。這使得開發過程非常直觀和高效。
3. 組件化:Streamlit提供了一系列簡單的Python函數,用於創建文本、圖表、表格、圖像等UI組件。這使得開發者可以輕松地構建出復雜的用戶界面。
4. 數據流與響應式編程:Streamlit支持響應式編程模型。當用戶與應用程序進行交互時(例如點擊按鈕或更改滑塊值),Streamlit會自動檢測這些事件,並更新相應的UI組件。這種數據流機制使得應用程序能夠實時響應用戶的操作。
5. 運行流程:
a. 安裝與配置:首先,你需要在你的系統上安裝Streamlit。這通常可以通過運行`pip install streamlit`命令來完成。安裝完成後,你可以根據需要配置一些Streamlit的參數,如跨域資源共享設置、服務器地址等。
b. 編寫代碼:接下來,你可以開始編寫你的Streamlit應用代碼。這通常包括定義數據處理邏輯、創建UI組件以及設置用戶交互等。
c. 運行應用:一旦你的代碼編寫完成,你可以通過運行`streamlit run your_script.py`命令來啟動你的Streamlit應用。Streamlit會啟動一個Web服務器,並在你的默認瀏覽器中打開一個新的標簽頁來顯示你的應用。
d. 交互與反饋:用戶可以與應用程序進行交互,例如查看數據、調整參數或觸發某些操作。Streamlit會根據用戶的操作實時更新UI組件,並提供即時反饋。
e. 部署與分享:你還可以選擇將你的Streamlit應用部署到雲上,以便其他人也可以訪問和使用。Streamlit提供了簡單的部署選項,使得分享你的應用變得非常容易。
總的來說,Streamlit通過其獨特的執行原理和流程,使得開發者能夠快速地構建和部署交互式Web應用程序,而無需深入了解前端開發技術。這使得數據科學家和機器學習工程師能夠更專註於他們的核心業務邏輯,提高開發效率。
Streamlit的執行原理和流程可以通過以下示例進行說明:
首先,假設你有一個Python腳本,其中包含了數據處理和可視化的邏輯。這個腳本可能使用Pandas進行數據處理,使用Matplotlib或Plotly進行圖表繪制。然而,這個腳本只能在命令行中運行,對於非技術人員來說可能不太友好。
為了將這個腳本轉化為一個交互式的Web應用程序,你可以使用Streamlit。你需要在你的腳本中添加一些Streamlit的API調用,這些API調用會創建用戶界面(UI)組件,如文本框、按鈕、圖表等。
例如,你可以使用`st.text`來顯示文本,`st.button`來創建一個按鈕,`st.dataframe`來顯示一個Pandas數據框,以及`st.plotly_chart`來顯示一個Plotly圖表。這些API調用將你的Python代碼與Streamlit的UI組件庫連接起來。
然後,當你運行這個包含Streamlit代碼的Python腳本時(通常使用`streamlit run your_script.py`命令),Streamlit會啟動一個Web服務器,並在你的默認瀏覽器中打開一個新的標簽頁來顯示你的應用程序。
在這個Web應用程序中,用戶可以查看你顯示的數據和圖表,也可以與應用程序進行交互。例如,他們可以點擊按鈕來觸發某些操作,或者更改滑塊的值來更新圖表。這些用戶操作會觸發Streamlit的事件處理機制。
Streamlit會監聽這些事件,並根據用戶的操作更新UI組件。例如,如果用戶點擊了一個按鈕,Streamlit可能會重新運行一段Python代碼來更新數據或生成新的圖表,並將結果實時顯示在瀏覽器中。
這種執行原理和流程使得Streamlit能夠提供一個直觀且高效的開發體驗。開發者可以專註於編寫Python代碼來處理數據和創建可視化,而無需擔心前端的實現細節。同時,用戶也可以通過簡單的交互來探索和理解數據,而無需編寫任何代碼。
總的來說,Streamlit通過其獨特的執行原理和流程,將Python腳本轉化為交互式的Web應用程序,從而簡化了數據科學和機器學習項目的開發和分享過程。
四、Streamlit 如何自定義CSS
Streamlit 允許你通過一些不同的方法來自定義應用的 CSS 樣式。盡管 Streamlit 的主要目標是讓開發者無需深入前端知識就能創建應用,但有時你可能需要調整一些視覺元素以滿足特定的品牌或設計需求。以下是一些自定義 Streamlit 應用 CSS 的方法:
1. 使用內聯樣式:
你可以在 Streamlit 組件上直接應用簡單的 CSS 樣式。例如,使用 `st.markdown` 時,你可以直接在 Markdown 文本中嵌入 HTML 和 CSS。
python
st.markdown(
"""
<style>
.custom-class {
color: blue;
font-size: 20px;
}
</style>
<p class="custom-class">這是自定義樣式的文本。</p>
""",
unsafe_allow_html=True,
)註意:使用 `unsafe_allow_html=True` 參數時要小心,確保你完全信任嵌入的 HTML 內容,以避免跨站腳本攻擊(XSS)。
2. 全局 CSS 文件:
你可以創建一個全局的 CSS 文件,並在 Streamlit 應用啟動時加載它。這可以通過在命令行中使用 `--custom-css` 參數指定 CSS 文件路徑來實現。
bash
streamlit run your_app.py --custom-css your_custom_styles.css
在 `your_custom_styles.css` 文件中,你可以定義全局的 CSS 規則,這些規則將應用於你的 Streamlit 應用的所有元素。
3. 在 Streamlit 應用中動態加載 CSS:
你也可以在 Python 腳本中動態地加載 CSS 樣式。這可以通過將 CSS 內容寫入一個臨時的 CSS 文件,並使用 Streamlit 的 `static` 文件夾來實現。
python
import os
#創建或覆蓋 CSS 文件
with open("static/custom.css", "w") as f:
f.write("""
.custom-class {
color: red;
}
""")
# 確保 Streamlit 重新加載靜態文件
if not os.path.exists(".streamlit/"):
os.makedirs(".streamlit/")
open(".streamlit/secret.key", "a").close()
# 運行你的 Streamlit 應用
streamlit.run(your_app_function)然後,在你的 Streamlit 應用中,你可以通過引用這個 CSS 類來應用樣式。Streamlit 會自動處理靜態文件夾中的內容。
4. 覆蓋默認樣式::
如果你知道 Streamlit 組件的默認 CSS 類名,你可以直接在你的 CSS 文件中覆蓋這些樣式。這通常需要對 Streamlit 的內部實現有一定的了解,因此不建議隨意覆蓋默認樣式,除非絕對必要。
請註意,由於 Streamlit 的內部實現可能會隨著版本的更新而發生變化,依賴特定 CSS 類名的自定義樣式可能在未來的版本中失效。因此,在自定義 Streamlit 應用樣式時,最好保持你的 CSS 規則盡可能通用和可維護。
五、Streamlit 如何嵌入執行js
Streamlit 本身並不直接支持嵌入並執行 JavaScript 代碼。Streamlit 的主要目標是讓開發者能夠使用 Python 來創建數據科學和機器學習應用的 Web 界面,而無需編寫任何前端代碼(如 HTML、CSS、JavaScript)。因此,Streamlit 的設計哲學是盡量避免讓開發者接觸到 JavaScript 或其他前端技術。
然而,盡管 Streamlit 沒有直接提供嵌入 JavaScript 的功能,但你還是可以通過一些間接的方式來實現類似的效果:
1. 使用 `st.markdown` 和 `unsafe_allow_html=True`:
你可以使用 Streamlit 的 `st.markdown` 函數來顯示 Markdown 文本,並通過設置 `unsafe_allow_html=True` 參數來允許嵌入 HTML 內容。雖然這並不能直接執行 JavaScript,但你可以在 HTML 中包含一些內聯的 JavaScript 代碼。然而,請註意,使用 `unsafe_allow_html=True` 可能會引入安全風險,特別是當你嵌入的內容來自不可信的源時。確保你完全信任嵌入的 HTML 和 JavaScript 代碼,以避免跨站腳本攻擊(XSS)。
python
st.markdown(
"""
<script>
// 這裏是你的 JavaScript 代碼,但請註意安全風險!
alert('Hello from JavaScript!');
</script>
""",
unsafe_allow_html=True,
)2. 使用 iframe::
另一個選項是使用 `st.iframe` 函數來嵌入一個外部的網頁或應用,這個網頁或應用可以包含和執行 JavaScript 代碼。這種方法允許你在 Streamlit 應用中展示一個完整的 Web 頁面,但需要註意的是,你無法直接控制或訪問該頁面中的 JavaScript 代碼。
python
st.iframe("https://example.com/your-javascript-app", height=600)3. 後端處理與前端展示:
對於需要與 Streamlit 應用交互的 JavaScript 代碼,通常更好的做法是將數據處理和邏輯放在 Python 後端,並通過 Streamlit 提供的組件和 API 來展示結果。然後,你可以使用 Streamlit 的組件(如按鈕、滑塊等)來觸發 Python 代碼的執行,並更新界面。
4. 自定義組件::
如果你需要實現的功能非常復雜,並且 Streamlit 提供的標準組件無法滿足你的需求,你可以考慮開發自定義組件。這通常涉及到編寫前端代碼(包括 HTML、CSS 和 JavaScript),並通過 Streamlit 的組件 API 與 Python 後端進行通信。然而,這通常是一個相對高級且復雜的任務,需要具備一定的前端開發經驗。
總的來說,盡管 Streamlit 沒有直接提供嵌入和執行 JavaScript 的功能,但你仍然可以通過上述方法實現一些類似的效果。不過,在嘗試這些方法時,請務必註意安全風險,並謹慎處理來自不可信源的內容。
六、Streamlit 靜態資源
Streamlit 允許你添加靜態資源到你的應用中,這些資源可以是圖片、CSS 文件、JavaScript 文件或其他任何你希望在應用中使用的靜態文件。這些資源通常被放置在應用的 `static` 文件夾中,Streamlit 會自動地為你服務這些文件。
以下是如何在 Streamlit 應用中使用靜態資源的一些示例:
1. 添加圖片
假設你有一個名為 `logo.png` 的圖片文件,你可以將它放在應用的 `static` 文件夾中。然後,你可以使用 `st.image` 函數來顯示這個圖片:
python
import streamlit as st
# 顯示 static 文件夾中的圖片
st.image('static/logo.png')2. 引用 CSS 文件
你可以將 CSS 文件放在 `static` 文件夾中,並通過 `<link>` 標簽在 Markdown 中引用它,或者使用 `--custom-css` 命令行參數來指定一個外部的 CSS 文件。
在 Markdown 中引用 CSS 文件:
python
import streamlit as st
# 在 Markdown 中引用 static 文件夾中的 CSS 文件
st.markdown(
"""
<style>
@import url('static/styles.css');
</style>
""",
unsafe_allow_html=True,
)使用命令行參數引用 CSS 文件:
當你運行 Streamlit 應用時,你可以使用 `--custom-css` 參數來指定一個外部的 CSS 文件:
bash
streamlit run your_app.py --custom-css path/to/your/custom.css
3. 引用 JavaScript 文件
雖然 Streamlit 不直接支持在應用中執行 JavaScript 代碼,但你可以將 JavaScript 文件放在 `static` 文件夾中,並通過 `<script>` 標簽在 Markdown 中引用它。然而,請註意,由於安全性和跨域限制,直接在 Streamlit 應用中執行的 JavaScript 代碼可能無法與後端 Python 代碼進行交互。
python
import streamlit as st # 在 Markdown 中引用 static 文件夾中的 JavaScript 文件 st.markdown( """ <script src="static/script.js"></script> """, unsafe_allow_html=True, )
4. 其他靜態資源
除了圖片、CSS 和 JavaScript 文件外,你還可以將其他類型的靜態文件(如 PDF、Word 文檔、Excel 文件等)放在 `static` 文件夾中,並通過 Streamlit 的 `st.download_button` 函數提供下載鏈接。
python
import streamlit as st
# 創建一個下載鏈接,指向 static 文件夾中的文件
st.download_button(
label="Download File",
data=open('static/example.pdf', 'rb'),
file_name='example.pdf',
mime='application/pdf'
)註意事項:
- 確保你的 `static` 文件夾與你的 Streamlit 應用腳本位於同一目錄中。
- 當你更新或添加新的靜態資源時,可能需要重啟你的 Streamlit 應用來確保這些更改被正確地加載。
- 使用 `unsafe_allow_html=True` 時要小心,確保你完全信任嵌入的 HTML 和相關資源,以避免安全風險。
七、Streamlit 布局問題
Streamlit的布局是創建直觀且用戶友好的Web應用的關鍵部分。以下是幾種常見的Streamlit布局方法:
1. 側邊欄布局:使用`st.sidebar`可以創建一個側邊欄,這個側邊欄可以包含各種元素,如選擇框、滑塊等,而且側邊欄的大小是可以調整的。你可以使用“with”語法或對象語法來定義側邊欄中的內容。
2. 主區域布局:除了側邊欄,Streamlit的主區域也可以放置各種元素。你可以通過簡單地調用Streamlit的函數(如`st.title`、`st.text`、`st.image`等)來添加內容。這些元素會按照你添加的順序從上到下排列。
3. 表格布局:對於表格數據,Streamlit提供了`st.table`和`st.dataframe`兩個函數。然而,這兩個函數在布局上存在一些局限,如不能控制每個列的寬度,行數多時會在頁面上一直往下排列等。為了解決這個問題,你可以考慮使用第三方庫如`streamlit-aggrid`,它提供了更強大的表格展示功能,包括無縮略、列寬設置合理以及可以左右、上下滑動等。
4. 自定義布局:除了上述布局方式,你還可以通過CSS和HTML來進一步自定義Streamlit的布局。雖然Streamlit的主要目標是讓開發者能夠使用Python來創建應用,而不是編寫前端代碼,但Streamlit允許你通過`st.markdown`函數(設置`unsafe_allow_html=True`)來嵌入HTML和CSS代碼,從而實現更復雜的布局和樣式定制。
請註意,雖然這些方法可以幫助你改善Streamlit應用的布局,但過度依賴自定義布局和前端代碼可能會使你的應用變得復雜且難以維護。因此,建議你在滿足功能需求的同時,盡量保持布局的簡潔和直觀。
最後,隨著Streamlit的不斷更新和發展,新的布局方法和特性可能會被引入。因此,建議經常查閱Streamlit的官方文檔和社區資源,以了解最新的布局最佳實踐和技巧。
八、Streamlit 錄音組件
Streamlit本身並沒有提供內置的錄音組件,但你可以通過結合其他技術或庫來實現錄音功能。一種可能的方法是使用Python的錄音庫(如`sounddevice`或`pyaudio`)來捕獲音頻數據,並通過Streamlit的API將其與用戶界面集成。
你可以創建一個自定義的Streamlit組件,該組件包含一個錄音按鈕,當用戶點擊該按鈕時,開始錄音並存儲音頻數據。錄音結束後,你可以將音頻數據保存為文件,並在Streamlit應用中提供下載或播放的功能。
需要註意的是,實現錄音功能可能涉及到一些復雜的音頻處理和文件操作,因此你可能需要具備一定的Python編程和音頻處理知識。
此外,由於Streamlit主要面向的是數據科學和機器學習應用,錄音功能可能並不是其核心功能之一。因此,如果你需要實現復雜的錄音功能,可能需要考慮使用其他更適合音頻處理的框架或工具。
最後,如果你對開發自定義的Streamlit錄音組件感興趣,可以參考Streamlit的官方文檔和社區資源,以獲取更多關於創建自定義組件和集成外部庫的指導。
九、Streamlit 事件如何處理
在Streamlit中,處理用戶與應用界面之間的交互主要依賴於事件。事件可以由用戶的點擊、滑動、輸入等動作觸發。Streamlit使用了一個稱為"session state"的概念來跟蹤和管理這些事件的狀態。以下是一些處理Streamlit事件的常見方法:
1. 使用`st.session_state`
`st.session_state`是一個字典,用於在Streamlit應用的多個運行之間存儲和檢索數據。你可以用它來跟蹤用戶與應用的交互狀態。
python
import streamlit as st
# 初始化session state中的變量
if 'counter' not in st.session_state:
st.session_state.counter = 0
# 增加計數器
st.session_state.counter += 1
# 顯示計數器的值
st.write(f'You have clicked {st.session_state.counter} times.')
# 創建一個按鈕,點擊時增加計數器
if st.button('Click me'):
st.session_state.counter += 1在這個例子中,每次點擊按鈕時,`st.session_state.counter`的值都會增加,並且會顯示給用戶。
2. 使用回調函數
雖然Streamlit沒有直接的回調函數機制,但你可以通過`st.session_state`和條件語句來模擬回調行為。
python
import streamlit as st
# 假設有一個列表來保存用戶的選擇
if 'selected_options' not in st.session_state:
st.session_state.selected_options = []
# 顯示一個側邊欄,其中包含一些選項
with st.sidebar:
options = ['Option 1', 'Option 2', 'Option 3']
for option in options:
if st.checkbox(option):
if option not in st.session_state.selected_options:
st.session_state.selected_options.append(option)
else:
st.session_state.selected_options.remove(option)
# 根據用戶的選擇執行某些操作
if st.session_state.selected_options:
st.write('You selected:', st.session_state.selected_options)
# 在這裏添加回調函數的行為,例如調用某個函數
else:
st.write('No options selected.')3. 使用表單提交
對於更復雜的表單提交場景,你可以使用`st.form`和`st.form_submit_button`來創建一個表單,並在用戶提交時處理數據。
python
import streamlit as st
# 創建一個表單
with st.form('myForm'):
text_input = st.text_input('Enter some text')
checkbox = st.checkbox('Check me')
submit_button = st.form_submit_button(label='Submit')
# 檢查表單是否已提交
if submit_button:
st.write('Form submitted!')
st.write('Text input:', text_input)
st.write('Checkbox:', checkbox)在這個例子中,當用戶填寫表單並點擊提交按鈕時,會觸發一個事件,你可以在`if submit_button:`塊中處理這個事件。
註意事項:
- `st.session_state`是全局的,並且在應用的整個生命周期中都是可用的。因此,你需要小心處理狀態,以避免意外的副作用。
- 由於Streamlit應用的運行是響應式的,即每次用戶與界面交互時都會重新運行整個腳本,因此你需要確保你的代碼是冪等的,以避免不必要的重復計算或行為。
- 在處理事件時,確保你的代碼能夠適當地處理用戶可能的各種輸入和交互情況,以提供健壯和可靠的用戶體驗。
相關文章
