首页 > 编程语言 >Streamlit 快速构建交互式页面的python库

Streamlit 快速构建交互式页面的python库

时间:2023-11-15 19:08:08浏览次数:88  
标签:python st 交互式 按钮 组件 Streamlit js streamlit 页面

Streamlit 快速构建交互式页面的python库_python

基础介绍

streamlit 是什么

Streamlit是一个面向机器学习和数据科学团队的开源应用程序框架,通过它可以用python代码方便快捷的构建交互式前端页面。streamlit特别适合结合大模型快速的构建一些对话式的应用,可以看到一些行业内热门的使用。

Streamlit 快速构建交互式页面的python库_前端页面_02

Streamlit 快速构建交互式页面的python库_数据可视化_03

Streamlit 快速构建交互式页面的python库_python_04

项目本身也比较成熟,release版本,start数量等都表明该项目持续打磨了很长时间。

Streamlit 快速构建交互式页面的python库_python_05


streamlit 简单示例

import streamlit as st
import numpy as np
import matplotlib.pyplot as plt

st.title('Sin')

# Get user input for frequency and amplitude
freq = st.slider('频率', min_value=1, max_value=10, value=1)

# Create x values
x = np.linspace(0, 2*np.pi, 1000)

# Create y values
y = np.sin(freq * x)

# Plot the graph
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Sine Wave')
ax.set_xlabel('X')
ax.set_ylabel('Y')
st.pyplot(fig)

运行代码

streanlit run sample_demo.py

Streamlit 快速构建交互式页面的python库_python_06

streamlit 优缺点

streamlit优点:

  • 不需要掌握前端知识就能创建web页面
  • 内置很多机器学习交互的展示组件,更有利于算法工程师使用
  • 开发速度快,修改方便

streamlit缺点:

  • 前端界面固定,开发者不能随意调整控件位置
  • 只适合于少量页面的项目,不适用于复杂网页的网站前端


组件集合

streamlit 主要用于构建前端页面,有着丰富的前端组件。 streamlit 官方文档:https://docs.streamlit.io/library/get-started/main-concepts

从官方文档来看,主要的组件包括:

  1. 文本
  2. 数据表格
  3. 图表
  4. 输入组件
  5. 媒体组件
  6. 布局和容器
  7. 聊天框
  8. 状态展示
  9. 控制流程


下面将常见的组件拿出来,做一个集合。stremlit的一个页面叫做一个app,可以将多个页面组装起来,如下图:

Streamlit 快速构建交互式页面的python库_python_07


Streamlit 快速构建交互式页面的python库_前端页面_08


文字

Streamlit 快速构建交互式页面的python库_数据可视化_09

数据表格

Streamlit 快速构建交互式页面的python库_python_10

输入组件

Streamlit 快速构建交互式页面的python库_数据可视化_11

聊天

Streamlit 快速构建交互式页面的python库_python_12


js和html 渲染

上文中已经提到streamlit的组件排列方式是从上到下逐个渲染,无法做到html那样灵活的调整组件的位置。但是stream还是提供了两个函数可以支持对页面css和js的修改。


对css的修改

streamlit中按钮是没有背景颜色的,如果想增加按钮的底色,就可以对其css修改。如下:

import streamlit as st

st.button("点击我")

hide_streamlit_style = """
       <style>
       .ef3psqc11 {background-color: yellowgreen}
       </style>
       """
st.markdown(hide_streamlit_style, unsafe_allow_html=True)

通过类名找到对应的按钮,然后准备好css代码,最后使用st.markdown函数将css渲染到页面上。

Streamlit 快速构建交互式页面的python库_python_13



这时就可以通过css 隐藏属性来完成。根据按钮的id找到按钮,隐藏该组件。

hide_streamlit_style = """
        <style>
        #MainMenu {visibility: hidden;}
        footer {visibility: hidden;}
        </style>
        """
st.markdown(hide_streamlit_style, unsafe_allow_html=True)

插入js

除了可以插入css之后,streamlit也支持插入js代码,这个功能就赋予streamlit操作html页面的能力。上面修改按钮颜色的需求通过js也能实现。首先通过js找到按钮,然后对元素的属性赋值。

import streamlit as st
import streamlit.components.v1 as components

st.button("点击我")

# hide_streamlit_style = """
#        <style>
#        .ef3psqc11 {background-color: yellowgreen}
#        </style>
#        """
# st.markdown(hide_streamlit_style, unsafe_allow_html=True)



js_btn = '''window.parent.document.getElementsByClassName("ef3psqc11")[0].style.backgroundColor = "bisque"'''
components.html(f'''<script>{js_btn}</script>''', width=0, height=0)

修改js使用的是import streamlit.components.v1 as components,和普通js不同的是需要在js前面加上window.parent,否则不能生效。

除了支持原生js之后,也支持jquery库。


组件工作原理

使用streamlit构建的页面和html构建的页面在工作方式上有很大的不同,streamlit有自己的一套工作机制,具体来说有如下两点注意:

  1. streamlit 根据组件在代码的位置,从上至下渲染组件
  2. 点击或触发某一个控件之后,代码会从上至下执行一遍


会话状态

在前文中提到streamlit中触发一个按钮会重新执行整个文件,相当于整个代码重新执行一遍,这样带来的一个副作用就是前后两次操作不能互相传递数据。比如下图中想要实现点击确定按钮,将输入的内容展示在最上面。


Streamlit 快速构建交互式页面的python库_前端页面_14

这个简单的需求反而不好实现,因为点击确定按钮之后,整个程序重新执行,输入的用户名和密码已经是上一次页面的数据,无法传递到下一次页面渲染中。这时就需要会话状态来解决这个问题了。

首先解释一下streamlit中的会话。在streamlit中一个tab页表示一个会话,新开tab页或者刷新页面都代表会话失效。会话机制提供了一种能力:在会话中,也就是一个tab中存在一个全局对象,支持插入、更新、删除数据,该对象在会话任何时机都可以使用。会话机制可以有效解决页面渲染前后带来的数据传递问题。

下面看看通过会话机制如何解决数据传递

import streamlit as st

msg = ""
if "name" in st.session_state:
    msg = {"name": st.session_state.name, "passwd": st.session_state.passwd}

st.write(f"输入的内容是:{msg}")
name = st.text_input(label="用户名:")
passwd = st.text_input(label="密码:")
submit = st.button("确定")
if submit:
    st.session_state["name"] = name
    st.session_state["passwd"] = passwd
streamlit run text_input.py

Streamlit 快速构建交互式页面的python库_数据可视化_15

st.session_state 就是会话机制的全局变量,在按钮点击之后向st.session_state中更新数据,当新一轮循环开始时判断st.session_state中是否有name属性,如果存在name数据表明会话中有数据,读取数据展示出来。

st.session_state支持即支持字典的数据管理方式,也支持属性的管理方式。也就是说获取一个数据,st.session_state["data"]st.session_state.data都是支持的


避坑指南

在实际使用streamlit中也有到一些让人困惑的事情,下面列举出来避免有人同样踩坑。

不同按钮的监听方式会影响组件渲染顺序

按钮有两种监听方式,分别是监听按钮变量和绑定回调函数

# 按钮监听方法1
submit = st.button()
if submit:
    pass 


# 按钮监听方法2
submit = st.button(on_click=handler_click)

这两种监听方式有不同的组件渲染顺序。具体来说是:

  1. 使用监听按钮方式,点击按钮之后程序重新执行所有代码,执行到按钮时进入监听代码片段
  2. 使用回调函数,点击按钮之后先执行回调函数,再重新执行所有代码


如下获取输入框信息,就会发现获取的是button出现时input输入框的状态,而不是最新的状态

import streamlit as st

def get_username_passwd(username, password):
    st.write("username:", username, "password:", password)


with st.form("登录页面"):
    username = st.text_input("用户名")
    password = st.text_input("密码")

    # 使用on_click的方法,获取的是button出现时input输入框的状态,而不是最新的状态。逆天bug
    submitted = st.form_submit_button("登录", on_click=get_username_passwd, args=(username, password))

元素没有固定ID

在streamlit中生成的页面没有固定的class name 或 id。在不同环境下可能生成不一样的class name。所以通过js或css修改页面的方法往往不能通用,因为类名会发生变化。

可靠的获取元素的方法是使用 data-testid="stFormSubmitButton"中的 data_testid。

Streamlit 快速构建交互式页面的python库_python_16

但是如果页面中有多个相同属性的 data-testid,那么这种方式也不可靠。


使用建议

来自三体人的呐喊:

不要在大型项目中使用!

不要在大型项目中使用!

不要在大型项目中使用!

streamlit调整布局是一件痛苦的事情。个人真实感受:如果说做项目想盖房子,做普通项目是用水泥砖头盖房子,用streamlit像是用积木盖房子,感觉碰一下就倒了。

Streamlit 快速构建交互式页面的python库_数据可视化_17



streamlit更适合用在功能单一,页面较少,没有页面跳转的项目上。各种封装好的组件能够快速实现一个最小可行性产品(MVP),避免后端工程师在前端页面花费太长时间。


标签:python,st,交互式,按钮,组件,Streamlit,js,streamlit,页面
From: https://blog.51cto.com/u_12504664/8400028

相关文章

  • python 打包exe并可以在别人电脑上运行
    1:下载安装installerpipinstallpyinstaller2:打包pyinstaller-Fxxxx.py(-F打包的是带python环境的包 不带f,打的是本地可执行的包)3:运行效果......
  • python if判断和循环判断
    if判断在写代码的时候,往往需要根据某些条件进行判断,并根据判断结果执行不同的分支代码。#单个条件a=1ifa==1:print(11111)ifa==2:print(2222)else:print(333)#多个条件,加多少个都可以ifa==1:print(11111)elifa==2:print(22222)else:pri......
  • Python简史
    Python的历史可以追溯到上世纪80年代末和90年代初,由荷兰计算机科学家GuidovanRossum在荷兰国家研究所(CWI)开发而成。以下是Python的详细历史:1980年代:Python的起源可以追溯到1980年代末期。GuidovanRossum作为一个编程爱好者,受到ABC语言的启发,希望创建一种简......
  • Python:dcm转jpg脚本
    importpydicomfromPILimportImageimportnumpyasnpimportosdefconvert_dicom_to_jpeg(dicom_file_path,output_folder):#读取DICOM文件dicom_file=pydicom.dcmread(dicom_file_path)#将DICOM数据转换为numpy数组image_array=dicom_file......
  • python tkinter treeview 仿 excel表格
    代码:fromtkinterimportttkfromtkinterimport*root=Tk()#初始框的声明columns=("姓名","IP地址")treeview=ttk.Treeview(root,height=18,show="headings",columns=columns)#表格treeview.column("姓名",width=100,a......
  • 软件测试|Python openpyxl库使用指南
    简介我们之前介绍过,python在自动化办公方面可以大放异彩,因为Python有许多的第三方库,其中有很多库就支持我们对office软件进行操作,熟练的使用Python对office进行操作,可以实现自动化办公,极大提升我们的工作效率。本篇文章,我们就来介绍一下处理Excel的第三方库,openpyxl的使用。安......
  • 软件测试|Python Faker库使用指南
    简介Faker是一个Python库,用于生成虚假(假的)数据,用于测试、填充数据库、生成模拟数据等目的。它可以快速生成各种类型的虚假数据,如姓名、地址、电子邮件、电话号码、日期等,非常适合在开发和测试过程中使用。本文将介绍PythonFaker库的详细使用。安装Faker库首先,我们要先安装Fak......
  • 软件测试|Python数据可视化神器——pyecharts教程(八)
    Pyecharts绘制热力图当涉及可视化数据时,热力图是一种强大的工具,它可以帮助我们直观地了解数据集中的模式和趋势。在本文中,我们将学习如何使用Python中的Pyecharts库创建热力图,以便将数据转化为可视化的形式。什么是热力图?热力图是一种用于显示数据密度的二维图表,其中颜色的......
  • 软件测试|Python urllib3库使用指南
    简介当涉及到进行网络请求和处理HTTP相关任务时,Python的urllib3库是一个强大且灵活的选择。它提供了一种简单的方式来执行HTTP请求、处理响应和处理连接池,使得与Web服务进行交互变得更加容易。本文将详细介绍如何使用urllib3库进行网络请求。安装urllib3首先我们需要安装urlli......
  • 不懂乐理,也能扒谱,基于openvpi将mp3转换为midi乐谱(Python3.10)
    所谓"扒谱"是指通过听歌或观看演奏视频等方式,逐步分析和还原音乐作品的曲谱或乐谱的过程。它是音乐学习和演奏的一种常见方法,通常由音乐爱好者、乐手或学生使用。在扒谱的过程中,人们会仔细聆听音乐作品,辨别和记录出各个音符、和弦、节奏等元素,并通过试错和反复推敲来逐渐还原出准......