关于我在使用Steamlit中碰到的问题及解决方案总结
Steamlit 并不支持一个可以预览本地文件的路径选择器(并不上传文件)
解决方案:使用 Python 自带的 tkinter 来完成
参考:【Streamlit 选择文件夹的曲折方案】Streamlit选择文件夹-CSDN博客
import streamlit as st
from tkinter import filedialog, Tk
# Set up tkinter
root = Tk()
root.withdraw()
# Make folder picker dialog appear on top of other windows
root.wm_attributes('-topmost', 1)
def path_set(label_name: str, segment_name: str, note: str = '', init_path: str = '') -> str:
'''
label_name: 标题,用来分割不同的地址获取
segment_name: 标记,作为 session_state 的 key 以及 streamlit 组件的 key 的生成
note: 一些提示,写在地址选择上面
init_path: 初始路径,传入保存在本地的路径或其它
'''
# 会话保证刷新网页后不会丢失
if segment_name not in st.session_state:
st.session_state[segment_name] = init_path
# 选择路径提示
st.markdown('##### ' + label_name)
# 其它文本
st.write(note)
dirname_selected = None
col1, col2 = st.columns([4, 1])
empty_text = col1.empty()
empty_text.text_input(
label='1',
value=st.session_state[segment_name],
label_visibility='collapsed',
autocomplete='on',
key=segment_name + 'input' + 'a',
)
choice = col2.button('浏览文件', key=segment_name + 'button' + 'a')
if choice:
dirname_selected = filedialog.askdirectory(master=root)
if dirname_selected:
st.session_state[segment_name] = dirname_selected
empty_text.text_input(
label='2',
value=st.session_state[segment_name],
label_visibility='collapsed',
autocomplete='on',
key=segment_name + 'input' + 'b',
)
# st.write(st.session_state[segment_name]) # 测试时候用的,用来观察是否成功记录
思路就是用 st.columns 将页面分两栏,然后使用 st.empty 来占位,将传入的 init_path 保存在 st.session_state 的字典中用来保证刷新后不会丢失,先创建一个 st.text_input来显示初始的 init_path ,然后通过 filedialog.askdirectory 获取到文件地址后,更新 st.empty,使得输入来显示选择的地址。
这个东西花了我很长时间,主要是不太理解 Streamlit 的运作模式,又到处找能用的代码
Streamlit运行
Streamlit 的运行比较反常,不是通过 Python 而是通过 Python 环境中的 Streamlit 命令进行的,很多时候运行和调试起来很麻烦(VSCode上),下面是几种运行方式
VSCode 调试
在项目文件夹下的 .vscode 文件夹,里面的 launch.json 文件中加入
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Streamlit",
"type": "debugpy",
"request": "launch",
"module": "streamlit.web.cli",
"env": {
"STREAMLIT_ENABLE_COLAB_BACKEND": "true"
},
"args": [
"run",
"${file}",
"--server.port", "667",
"--server.address", "127.0.0.1"
]
}
]
}
这样使用 CodeRunner 中的调试和直接按 F5 调试就可以直接启动了
另附,虽然 Streamlit 有点麻烦,不过正常调试还是可以调试的,打上断点之后启动调试就会卡住,或是随便在代码里加入一个无关紧要的空格(随便改改,不影响代码就行)后,点页面右上角的 Rerun
就OK(没有的话就在那三个点里)
通过 Python 直接运行
其实就是通过 Python 来执行命令
import streamlit.web.cli as stcli
import os, sys
if __name__ == "__main__":
if getattr(sys, 'frozen', False):
current_dir = sys._MEIPASS
else:
current_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(current_dir, "main.py")
sys.argv = ["streamlit", "run", file_path,
"--server.enableCORS=true", "--server.enableXsrfProtection=false",
"--global.developmentMode=false", "--client.toolbarMode=minimal"]
sys.exit(stcli.main())
注:这种是在 Python 环境中的命令,如果 Python 环境没有激活,也可以使用 Python.exe -m streamlit run <streamlit文件> 的形式来运行,例如:
可以把这个写成批处理脚本,例如:
.\runtime\python.exe -m streamlit run .\src\main.py
关于图表(主要是柱状图)
Streamlit 提供的 图表 可拓展的能力实在是太低,需要做一些精细化调整时就会出现问题(不过要求不太多的话还是很好使的,也很美观),如:
- 标签输出不能修改
- 不能取消柱状图表鼠标滚轮缩放
- 不能取消某个坐标轴的显示
- 会乱序
等等,不过毕竟是封装好的简单易用的功能,如果可以忍受瑕疵的话就不要使用第三方的组件(会出现一些奇怪的问题,后面会介绍)所以为了使用更加精细的表格生成,可以通过第三方组件引入 Apache EChart ,其中有两个(在官网上发布的):
- ECharts:streamlit-echarts
- Raw ECarts:streamlit-raw-echarts
它们本身功能类似,参考链接里的写法,其中配置项 option 的配置方法参考ECharts配置项手册。
注:由于在 Python 中,option 表现为一个字典,且 Python 内是没有对应的变量,所以要将 key 写为字符串形式,value 同理,除去传入的数据,布尔类型,数字,基本上剩下的都是字符串形式
它们的不同之处在一些更加细节的地方:
参数可不可以为 JavaScript 函数
它们都包含一个 JScode 函数,可以通过库来导入,但是这个函数在 streamlit-echart 中用处就不大(可能,至少我在尝试使用的时候只能报错),而在 streamlit-raw-echart 中是可以使用的,这个函数可以帮助部分配置项配置 JavaScript函数 ,如:
options = {
"tooltip": {
"show": True,
"trigger": "item",
"showContent": True,
"triggerOn": "mousemove",
"formatter": JsCode('''function(params){return params.name+'<br>抽数:'+ params.data.value +'<br>时间:'+ params.data.time}''')
},
}
其中 "formatter" 就对应了一个函数,用来为悬停提示加入部分数据,这种操作在 streamlit-echart 中就只会报错:
MarshallComponentException: ('Could not convert component args to JSON', TypeError('Object of type JsCode is not JSON serializable'))
大概意思就是说 JsCode 类不能被 Json 序列化
参数名字不同
切记注意两个库中函数名同样是 st_echarts 的两个函数,其中的参数名却不一样
streamlit-echarts:optionsstreamlit-raw-echarts:option
关于我在使用Steamlit中碰到的问题及解决方案总结的更多相关文章
- php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz)
原文:php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz) 折腾了两天,dwz删除后,数据不能自动刷新,解决方案,直接看图 . 1. 删除.修改状态后无法刷新记录: 在dwz. ...
- studio中碰到的jni问题:java.lang.UnsatisfiedLinkError
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52606328 studio中碰到 ...
- RVM的安装和使用过程中碰到的问题
Ruby Version Manager简称RVM,是一款非常好用的ruby版本管理以及安装工具. 关于rvm的安装,可以参考以下文章: use rvm install and manage ruby ...
- 算法笔记(c++)--c++中碰到的一些用法
算法笔记(c++)--c++中碰到的一些用法 toupper(xxx)可以变成大写; tolower(xx)小写 isalpha(xxx)判断是不是字母 isalnum(xx)判断是不是数字 abs( ...
- VB6.0 中 碰到 提示rs对象关闭,不允许操作, 吃一堑长一智
VB6.0 中 碰到 提示rs对象关闭,不允许操作, 吃一堑长一智 如果碰到 这个错误提示 则请检查 你执行的每一个语句中的数据类型,包括 如果有存储过程的话,还要检查 存储过程中每一个变量和数据表 ...
- 【RAC】 RAC For W2K8R2 安装--安装过程中碰到的问题(九)
[RAC] RAC For W2K8R2 安装--安装过程中碰到的问题(九) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...
- Nginx 使用自签名证书实现 https 反代 Spring Boot 中碰到的页面跳转问题
问题一:页面自动跳转到 80 端口 问题描述 最近在使用Nginx反代一个Spring Boot项目中碰到了一个问题,使用 Spring Boot 中的 redirect: 进行页面跳转的时候,通过 ...
- 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题 ...
- td中使用overflow:hidden; 无效解决方案
td中使用overflow:hidden; 无效解决方案 >>>>>>>>>>>>>>>>>> ...
- GEF-whole-upload教程中遇到的问题及解决方案
最近在学习GEF开发,使用的是GEF-whole-upload这个教程.由于教程当时所使用的版本与本人使用的版本有一些差异,中间出现了不少问题,现在将解决方案分享给大家. 本人使用的Eclipse版本 ...
随机推荐
- C#中 CancellationTokenSource的妙用
在.NET中,CancellationTokenSource.CancellationToken和Task是处理异步操作和取消任务的重要工具.本文将通过一些简单的例子,帮助你理解它们的用法和协作方式. ...
- 【爬虫】爬虫简单举例(三种写法) 涉及requests、urllib、bs4,re
目录 写法1:requests + re 写法2:urllib + re 方法3:request + bs4 补充.我在发了这篇文章之后,后面又要爬这个论坛.然后我发现我没有认真观察那个网页的源码,所 ...
- nexus如何上传自己的依赖包
一.创建第三方包仓库创建第三方jar包的仓库选用hosted 取名为nexus-3rd 然后再public组中加入nexus-3rd,交给public管理 二.创建用户仓库创建完成以后可以创建一个管理 ...
- Qt编写地图综合应用26-覆盖物交互
一.前言 百度地图本身提供了非常友好完善的JS函数接口用于添加各种覆盖物,比如标注点.矩形区域.圆形区域.不规则线段.弧形等,基本上涵盖了各种应用场景,官方的文档和示例也是比较完善的,虽然示例用的都是 ...
- Qt音视频开发43-人脸识别服务端
一.前言 上一篇文章写道人脸识别客户端程序,当然要对应一个服务端程序,客户端才能正常运行,毕竟客户端程序需要与服务端程序进行交互他才能正常工作.通常人脸识别服务端程序需要和人脸识别的相关处理库在一起, ...
- Qt编写的项目作品29-RTSP播放器+视频监控(海康SDK版本)
一.功能特点 支持播放视频流和本地MP4文件. 支持句柄和回调两种模式. 多线程显示图像,不卡主界面. 自动重连网络摄像头. 可设置边框大小即偏移量和边框颜色. 可设置是否绘制OSD标签即标签文本或图 ...
- Docker Inspect 模板
Docker 使用Go 模板,您可以使用它来操作某些命令和日志驱动程序的输出格式. Docker 提供了一组基本函数来操作模板元素.所有这些示例都使用该docker inspect命令,但许多其他 C ...
- 一点区块链资料-copy
1. 场景描述 (1)今天找资料,无意中看到15年底-16年初弄的关于区块链的资料,当时写了个交流汇报区块链的ppt,感觉挺好的,共享下,希望能帮助朋友们理解区块链. (2)背景:15年底,老板从朋友 ...
- springboot+springsecurity项目
https://blog.csdn.net/qq_36748248/article/details/120932954 https://blog.csdn.net/weixin_41207479/ar ...
- 深入LinkedBlockingQueue实现原理
学习BlockingQueue之LinkedBlockingQueue实现原理 一:概念 LinkedBlockingQueue是一个用链表实现的有界阻塞队列.此队列的默认和最大长度为 Integ ...