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

  

posted @ 2024-04-27 21:33  优雅的代码  阅读(999)  评论(0编辑  收藏  举报