streamlit用法
import os.path import streamlit as st import pandas as pd import numpy as np """ 2.1 显示标题 st.title():用于创建页面的主要标题,通常是最大和最显眼的标题。它是在应用的顶部设置的,并且在整个页面中通常只使用一次,用于表示应用的主题或总体内容。 st.header():用于创建一个相对较小的标题,比st.title()稍微小一些。可以在应用中多次使用,用于将内容分成不同的部分或主题。 st.subheader():用于创建相对较小的标题,比st.header()还要小。可以在应用中多次使用,用于在小节内更细致地标识内容。 """ st.title('这是一个标题') st.header('这是一个较小的标题') st.subheader('这是一个相对较小的标题') st.write('这是写入的文本---Streamlit应用。') """ 2.2 显示文本 st.markdown():用于支持Markdown格式的文本,允许你使用Markdown语法来添加样式、链接、列表等元素。 它提供更灵活的文本呈现选项,允许你使用Markdown标记来创建富文本内容。 st.text():不支持Markdown语法,只显示纯文本内容 """ #支持markdown st.markdown(''' # 静夜思 床前**明月**光,疑是地上霜。 举头望**明月**,低头思故乡。 ''') #不支持makdown文本 st.text(''' 静夜思 床前明月光,疑是地上霜。 举头望明月,低头思故乡。''') """ 2.3 显示代码段 st.code()调用参数如下: body:要显示的代码字符串。 language:代码所使用的开发语言,字符串,默认值:python。 如果省略的话,将没有语法高亮效果。 """ st.markdown('**以下为打印的代码:**') st.code( ''' def bubble_sort(arr): n = len(arr) # 遍历所有数组元素 for i in range(n): # 最后 i 个元素已经排好序,不需要再比较 for j in range(0, n-i-1): # 如果元素比下一个元素大,则交换它们 if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # 示例使用 if __name__ == "__main__": # 测试数据 example_list = [64, 34, 25, 12, 22, 11, 90] print("原始数组:", example_list) # 调用冒泡排序函数 bubble_sort(example_list) print("排序后的数组:", example_list) ''', language='python') """ 2.4 通用显示方法 st.write():是Streamlit中用于在应用程序中展示文本和数据的通用函数。 它是一个多功能的函数,可以接受多种类型的参数,包括Markdown格式的字符串、数字、DataFrame、图表等。 """ import streamlit as st import matplotlib.pyplot as plt import numpy as np import pandas as pd # 字符串 st.write("这是一段文本。") # 数字 st.write(42) # 列表 st.write([1, 2, 3]) # 字典 st.write({"key": "value"}) # 数据框(DataFrame) df = pd.DataFrame({"Column 1": [1, 2, 3], "Column 2": ["A", "B", "C"]}) st.write(df) # 多参数用法 st.write("这是一个字符串", 42, [1, 2, 3], {"key": "value"}) # 自定义渲染 fig, ax = plt.subplots() x = np.linspace(0, 10, 100) y = np.sin(x) ax.plot(x, y) st.write(fig) """ 2.5 显示表格 st.dataframe():以表格的形式呈现数据,支持Pandas的特有功能,如排序、过滤等,并且会自动适应数据框的大小,如果数据框太大,它会自动启用滚动条。 参数如下: ①width:UI元素的期望宽度,单位为像素,类型为Int或None,如果是None的话,Streamlit将基于页面宽度计算元素宽度。 ②height:UI元素的期望高度,单位为像素,类型为Int或None。 st.table():用于显示通用表格数据,不仅支持Pandas,还可以处理列表、元组等可迭代数据结构。但st.table仅用于显示数据,而不提供诸如排序和过滤等数据框专有功能。 """ import streamlit as st import pandas as pd import numpy as np random_data = np.random.rand(15, 6) df = pd.DataFrame(random_data, columns=[f'Col{i}' for i in range(1, 7)]) st.dataframe(df) st.table(df) """ 另外,st.dataframe还可以传入一个Pandas Styler对象来修改所渲染的DataFrame的样式,例如将每一列的最大值高亮显示: """ st.dataframe(df.style.highlight_max(axis=0)) """ 2.6 显示JSON st.json():主要用于展示JSON格式的数据,会自动适应JSON数据的大小,如果数据较大会自动启用滚动条, 并且可以处理包含嵌套结构的复杂JSON数据,以树状结构的形式展示 """ st.json({ 'foo': 'bar', 'baz': 'boz', 'stuff': [ 'stuff 1', 'stuff 2', 'stuff 3', 'stuff 5', ], }) import streamlit as st import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots() x = np.linspace(0, 10, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot(x, y1, label='sin(x)') plt.plot(x, y2, label='cos(x)') plt.xlabel('x') plt.ylabel('y') plt.legend() st.pyplot(fig) # """ # 2.8 显示地图 # st.map():显示地图及叠加的数据点,支持自动居中与自动缩放。 # # 参数: # data:要显示的数据,必须包含字段lat、lon、latitude或longitude,可以是DataFrame、Styler、数组以及其他可迭代对象等类型: # zoom:缩放等级。 # use_container_width (bool): 是否使用容器的整个宽度。如果设置为True,地图将占据整个容器的宽度。 # # """ import st_leaflet #必需导入 # data = { # 'latitude': [32.7749, 34.0522, 40.7128], # 'longitude': [122.4194, 118.2437, 74.0060], # 'name': ['San Francisco', 'Los Angeles', 'New York'] # } # # st.map(data, zoom=4, use_container_width=True) # # 创建一个地图中心在纽约市的实例 # m = st_leaflet.map([52.5200, 13.4050], zoom=13) # # # 添加一个标记 # m.add_marker([52.5200, 13.4050], open_popup=True, popup="这里是柏林") # # # 显示地图 # st.markdown("## Map", unsafe_allow_html=True) # st.write(m) # # """ st.image():是Streamlit中用于在应用程序中显示图像的函数。它可以接受多种输入格式,包括文件路径、URL、图像的字节数据等。 参数如下: 默认参数为st.image(image, caption=None, width=None, use_column_width=False, clamp=False, channels='RGB', format='JPEG') image:要显示的图像,类型可以是numpy.ndarray,[numpy.ndarray],BytesIO,str,或[str])。单色图像为(w,h)或(w,h,1),彩色图像为(w,h,3),RGBA图像为(w,h,4),也可以指定一个图像url,或url列表 caption:图像标题,字符串。如果显示多幅图像,caption应当是字符串列表。 width:图像宽度,None表示使用图像自身宽度。 use_column_width:如果设置为True,则使用列宽作为图像宽度。 clamp:是否将图像的像素值压缩到有效域(0~255),仅对字节数组图像有效。 channels:图像通道类型,'RGB'或'BGR',默认值:RGB。 format:图像格式:'JPEG'或'PNG'),默认值:JPEG。 """ from PIL import Image image = Image.open('./zzgtest/upload/test.jpg') st.image(image, caption='标题', width=500 ) """ 2.10 显示视频 st.video():是Streamlit中用于在应用程序中显示视频的函数。它支持多种视频来源,包括本地文件、URL和字节数据。 参数: format(str or None):视频格式,可以是"mp4"、"webm"等。如果设置为None,Streamlit将尝试根据文件扩展名自动识别视频格式。 start_time(int):视频开始播放的时间(以秒为单位)。 """ import streamlit as st # 本地视频 # video_file = open('test.mp4', 'rb') # video_bytes = video_file.read() # st.video(video_bytes, format="mp4", start_time=2) # 网络视频 st.video("http://www.w3school.com.cn/i/movie.mp4") """#############################################################################################""" """ 3.1 按钮 st.button():是Streamlit中用于创建按钮的函数。 """ if st.button('点我'): st.write('今天是个好日子!') """ 3.2 复选框 st.checkbox():是Streamlit中用于创建复选框的函数 value默认为False,若设置为True,则复选框初始状态即为选中状态。 可以根据需要更改复选框的标签,并根据复选框的状态执行不同的操作,使用户能够通过选择或取消选择来影响应用程序的行为。 """ import streamlit as st cb = st.checkbox(label='确认', value=False, key='checkbox1') if cb: st.write('确认成功') else: st.write('没有确认') """ 3.3 单选框 st.radio():用于创建单选按钮组,使用户能够从一组选项中选择一个。 label(str):必需。单选框文本,将显示在按钮组上方,介绍单选框用途。 options(list,tuple,dict,orNone):必需。提供可供选择选项的列表、元组或字典。对于列表或元组,选项将按照它们在列表中的顺序显示。对于字典,将显示字典的键,并将字典的值用作用户选择的实际值。 index(int):可选。单选按钮组的初始选择索引,默认为0。即默认选中第一个选项。 format_func(function or None):可选。用于格式化选项的函数,以便在显示时进行自定义格式。 help(str or None):可选。为单选按钮组提供帮助文本,将在用户悬停在组件上时显示。 """ sex = st.radio( label='请输入您的性别', options=('男', '女', '保密'), index=2, format_func=str, help='如果您不想透露,可以选择保密' ) if sex == '男': st.write('男士您好!') elif sex == '女': st.write('女士您好!') else: st.write('您好!') """ 3.4 下拉框 st.selectbox():用于创建一个下拉选择框,使用户能够从一组选项中选择一个。 st.selectbox参数与st.radio一致。 """ sex = st.selectbox( label='请输入您的性别', options=('男', '女', '保密'), index=2, format_func=str, help='如果您不想透露,可以选择保密' ) if sex == '男': st.write('男士您好!') elif sex == '女': st.write('女士您好!') else: st.write('您好!') """ 3.5 多选框 st.multiselect():用于创建一个多选框,允许用户从一组选项中选择多个。 参数如下: label:必需。多选框的标签,将显示在多选框上方,用于标识多选框的用途。 options:必需。提供可供选择的选项的列表、元组或字典。对于列表或元组,选项将按照它们在列表中的顺序显示。对于字典,将显示字典的键,并将字典的值用作用户选择的实际值。 default(list, tuple, dict,or None):可选。多选框的初始选择,默认为None。如果提供了默认值,则多选框将在初始时显示这些选项。 format_func:可选。用于格式化选项的函数,以便在显示时进行自定义格式。 help:可选。为多选框提供帮助文本,将在用户悬停在组件上时显示。 """ options = st.multiselect( label='请问您喜欢吃什么水果', options=('橘子', '苹果', '香蕉', '草莓', '葡萄'), default='草莓', #可以为NONE format_func=str, help='选择您喜欢吃的水果' ) st.write('您喜欢吃的是', options) """ 3.6 滑动拉杆 st.slider():用于创建一个滑块,允许用户在一个范围内选择一个数值。 参数如下: label(str):必需。滑块的标签,将显示在滑块上方,用于标识滑块的用途。 min_value(int, float, datetime, or None):可选。滑块的最小值。可以是整数、浮点数或datetime对象。如果未提供,则默认为0。 max_value(int, float, datetime, or None):可选。滑块的最大值。可以是整数、浮点数或datetime对象。如果未提供,则默认为100。 value(int, float, datetime, or tuple):可选。滑块的初始值。可以是单个数值或表示范围的元组。如果提供了元组,用户将能够选择一个范围而不是单个值。 step(int, float, or None):可选。滑块上的步进值,用户可以通过拖动滑块选择。如果未提供,则默认为1。 format:可选。滑块的显示格式。可以是包含"{:.2f}"之类的格式字符串,用于控制显示的小数位数。 key:可选。为滑块分配的唯一键,用于识别和跟踪滑块的状态变化。通常用于确保组件的稳定性。 help:可选。为滑块提供帮助文本,将在用户悬停在组件上时显示。 """ age=st.slider(label='请输入您的年龄', min_value=0, max_value=100, value=0, step=1, help="请输入您的年龄" ) st.write('您的年龄是', age) """ 3.7 单行文本输入框 streamlit.text_input函数用于创建文本输入框,允许用户输入文本信息。 参数如下: label:必需。文本输入框的标签,将显示在输入框上方,用于标识输入框的用途。 value(str):可选。文本输入框的初始值,默认为空字符串。 max_chars(int or None):可选。文本输入框允许的最大字符数。如果未提供,则不设置字符数限制。 help:可选。为文本输入框提供帮助文本,将在用户悬停在组件上时显示。 """ name = st.text_input('请输入用户名', max_chars=100, help='最大长度为100字符',placeholder='max:100') # 根据用户输入进行操作 st.write('您的用户名是', name) """ 3.8 数字输入框 st.number_input():用于创建数字输入框,允许用户输入数字。 参数如下: label、format、help与前文一致 min_value(int, float, or None):可选。数字输入框的最小值。如果未提供,则不设置最小值限制。 max_value(int, float, or None):可选。数字输入框的最大值。如果未提供,则不设置最大值限制。 value(int, float, or None):可选。数字输入框的初始值。如果未提供,则默认为None。 step(int, float, or None):可选。数字输入框上的步进值,用户可以通过点击按钮调整。如果未提供,则默认为1。 """ import streamlit as st age = st.number_input(label='请输入您的年龄', min_value=0, max_value=100, value=0, step=1, help='请输入您的年龄' ) st.write('您的年龄是', age) """ 3.9 多行文本输入框 st.text_area():用于创建文本区域,允许用户输入多行文本信息。 参数如下: label、help与前文一致。 value(str):可选。文本区域的初始值,默认为空字符串。 height(int or None):可选。文本区域的高度,表示显示的文本行数。如果未提供,则根据内容自动确定高度。 max_chars(int or None):可选。文本区域允许的最大字符数。如果未提供,则不设置字符数限制。 """ import streamlit as st text = st.text_area(label='请输入文本', value='请输入...', height=5, max_chars=200, help='最大长度限制为200') st.write('您的输入是', text) """ 3.10 日期输入框 st.date_input():用于创建日期输入框,允许用户选择日期。 参数如下: label、help与前文一致 value(datetime.dateorNone):可选。日期输入框的初始值,应为datetime.date类型。如果未提供,则默认为None。 min_value(datetime.date or None):可选。日期输入框的最小值,用户不能选择早于该日期的日期。如果未提供,则不设置最小值限制。 max_value(datetime.date or None):可选。日期输入框的最大值,用户不能选择晚于该日期的日期。如果未提供,则不设置最大值限制。 """ import streamlit as st import datetime birthday = st.date_input(label='请输入您的出生年月', value=None, min_value=None, max_value=datetime.date.today(), help='请输入您的出生年月') st.write('您的生日是:', birthday) """ 3.11 时间输入框 st.time_input():用于创建时间输入框,允许用户选择时间。 参数如下: label、help与前文一致。 value(datetime.time or None):可选。时间输入框的初始值,应为datetime.time类型。如果未提供,则默认为None。 step(int or timedelta):可选。时间输入框的时间间隔。 """ import streamlit as st from datetime import time t = st.time_input(label='请输入一个时间', value=None, help='请输入一个时间') st.write('您输入的时间是:', t) """ 4.1 提示信息 streamlit提供了多种函数用于显示不同类型的消息,以呈现不同级别的通知和反馈。 st.error: 用于显示错误消息。通常用于向用户报告发生的错误或异常。 st.warning: 用于显示警告消息。通常用于向用户提供潜在的问题或需要注意的情况。 st.info: 用于显示一般信息消息。可以用于提供一般性的信息或指导。 st.success: 用于显示成功消息。通常用于向用户报告任务或操作成功完成。 st.exception: 用于显示异常消息。当发生异常时,可以使用此函数将异常信息呈现给用户。 """ import streamlit as st st.error('错误信息') st.warning('警告信息') st.info('提示信息') st.success('成功信息') st.exception('异常信息') """ 4.2 显示执行状态 st.progress:用于显示一个进度条,可以设置最小值、最大值和当前值。它通常用于表示长时间运行的非阻塞任务的进度。 st.spinner:用于显示一个旋转的加载器,表示任务正在执行。它通常用于表示短时间运行的任务的执行状态。当任务完成时,加载器将自动消失。 """ import streamlit as st import time progress_bar = st.empty() #设置一个点位符 for i in range(10): progress_bar.progress(i / 10, '进度') time.sleep(0.5) with st.spinner('加载中...'): time.sleep(2) """ 4.3 缓存修饰器 @st.cache_data装饰器用于记忆函数的历史执行。当使用@st.cache装饰一个函数时,Streamlit 会将该函数的结果存储在一个缓存中,以便在后续调用中直接返回缓存的结果,而不是重新计算。这可以提高应用程序的性能,特别是在处理大量数据或计算密集型任务时。 参数如下: func:要缓存的函数。如果提供了函数,则会对该函数的计算结果进行缓存。如果为None,则返回一个可以接受函数作为参数的装饰器。 ttl(int or None):必需。缓存的生存时间,以秒为单位。在缓存的生存时间内,对函数的调用将返回缓存的结果而不是重新计算。如果设置为None,缓存将永不过期。 max_entries(int or None):可选。缓存的最大条目数。当达到指定的最大条目数时,新的计算结果将替换最早的计算结果。 show_spinner(bool):可选。当进行缓存计算时,是否显示加载指示器。默认为True。 persist(bool):可选。是否将缓存数据持久化到磁盘。如果为True,数据将在应用程序重新启动时仍然存在。默认为False。 experimental_allow_widgets(bool):可选。是否允许在被缓存的函数中使用Streamlit小部件。默认为False。启用此选项时,可以在被缓存的函数中使用小部件。 hash_funcs(dictorNone):可选。用于指定自定义哈希函数的字典。键是参数名称,值是哈希函数。如果为None,将使用默认哈希函数。 """ import streamlit as st import time import pandas as pd @st.cache_data def fetch_data(url): time.sleep(5) return pd.read_html(url) url1 = 'https://blog.csdn.net/weixin_44458771/article/details/135495928' d1 = fetch_data(url1) st.write(d1) url2 = 'https://blog.csdn.net/weixin_44458771/article/details/135495928' d2 = fetch_data(url2) st.write(d2) st.cache_data.clear() url3 = 'https://blog.csdn.net/weixin_44458771/article/details/135495928' d3 = fetch_data(url3) st.write(d3) # 文本输入 user_input = st.text_input("请输入您的名字", "John Doe") # 滑动条 age = st.slider("请选择您的年龄", 18, 100, 30) # 选择框 job = st.selectbox("请选择您的职业", ["学生", "教师", "工程师", "其他"]) st.write(f"Hello, {user_input}!") st.write(f"您的年龄是 {age},职业是 {job}。") # 假设我们有一些数据 data = pd.DataFrame({ 'first_column': list(range(1, 101)), 'second_column': np.random.randn(100) }) # 用户选择显示的数据数量 number = st.slider("请选择显示数据的数量", 1, 100, 50) # 显示数据 st.write(data.head(number)) import matplotlib.pyplot as plt # 创建一个简单的图表 fig, ax = plt.subplots() ax.hist(data['second_column'], bins=20) st.pyplot(fig) # 使用列进行布局 col1, col2, col3 = st.columns(3) with col1: st.header("Column 1") st.write("这是第一列的内容") with col2: st.header("Column 2") with st.expander("点击展开更多信息"): st.write("这里是一信息。") st.write("这里是一信息。") with col3: st.header("Column 3") # 使用展开器创建隐藏内容 with st.expander("点击展开更多信息"): st.write("这里是一信息。") st.write("这里是一信息。") st.write("这里是一细信息。") # 使用展开器创建隐藏内容 with st.expander("点击展开更多信息"): st.write("这里是一些可以展开的详细信息。") st.write("这里是一些可以展开的详细信息。") st.write("这里是一些可以展开的详细信息。") # 状态管理与会话状态 # 为了在应用中管理复杂的用户交互,Streamlit引入了会话状态(session state)的概念。 # 会话状态允许您在用户与应用交互时保持某些信息的状态,这对于创建复杂的交互逻辑至关重要。 # 增加一个计数器 if 'count' not in st.session_state: st.session_state.count = 0 increment = st.button("增加") if increment: st.session_state.count += 1 st.write(f"计数器值:{st.session_state.count}") import requests # 与外部API交互获取数据 try: response = requests.get("https://api.example.com/data") if response.status_code == 200: data = response.json() st.write(data) else: st.error("获取数据失败。") except Exception as e: st.write("连接失败", str(e)) # 应用标题 st.title('交互式数据分析应用') # 文件上传 uploaded_file = st.file_uploader("选择一个py文件", type=['py', 'png', 'jpg', 'jpeg']) if uploaded_file is not None: # 获取文件名 file_name = uploaded_file.name # 读取文件内容 file_contents = uploaded_file.read() # 将文件保存到服务器的特定目录 file_path = './zzgtest/upload/' + file_name print(os.path.abspath(file_path)) # 将文件内容写入到服务器文件系统中 with open(file_path, "wb") as f: f.write(file_contents) st.write(f"文件 '{file_name}' 已保存到服务器。") # streamlit run ./zzgtest/test-streamlit.py