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 提供的 图表 可拓展的能力实在是太低,需要做一些精细化调整时就会出现问题(不过要求不太多的话还是很好使的,也很美观),如:

  1. 标签输出不能修改
  2. 不能取消柱状图表鼠标滚轮缩放
  3. 不能取消某个坐标轴的显示
  4. 会乱序

等等,不过毕竟是封装好的简单易用的功能,如果可以忍受瑕疵的话就不要使用第三方的组件(会出现一些奇怪的问题,后面会介绍)所以为了使用更加精细的表格生成,可以通过第三方组件引入 Apache EChart ,其中有两个(在官网上发布的):

  1. ECharts:streamlit-echarts
  2. 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:options
  • streamlit-raw-echarts:option

关于我在使用Steamlit中碰到的问题及解决方案总结的更多相关文章

  1. php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz)

    原文:php_DWZ-JUI中碰到的问题解决方法详解(thinkphp+dwz) 折腾了两天,dwz删除后,数据不能自动刷新,解决方案,直接看图  . 1. 删除.修改状态后无法刷新记录: 在dwz. ...

  2. studio中碰到的jni问题:java.lang.UnsatisfiedLinkError

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52606328 studio中碰到 ...

  3. RVM的安装和使用过程中碰到的问题

    Ruby Version Manager简称RVM,是一款非常好用的ruby版本管理以及安装工具. 关于rvm的安装,可以参考以下文章: use rvm install and manage ruby ...

  4. 算法笔记(c++)--c++中碰到的一些用法

    算法笔记(c++)--c++中碰到的一些用法 toupper(xxx)可以变成大写; tolower(xx)小写 isalpha(xxx)判断是不是字母 isalnum(xx)判断是不是数字 abs( ...

  5. VB6.0 中 碰到 提示rs对象关闭,不允许操作, 吃一堑长一智

    VB6.0 中 碰到 提示rs对象关闭,不允许操作,  吃一堑长一智 如果碰到 这个错误提示 则请检查 你执行的每一个语句中的数据类型,包括 如果有存储过程的话,还要检查 存储过程中每一个变量和数据表 ...

  6. 【RAC】 RAC For W2K8R2 安装--安装过程中碰到的问题(九)

    [RAC] RAC For W2K8R2 安装--安装过程中碰到的问题(九) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

  7. Nginx 使用自签名证书实现 https 反代 Spring Boot 中碰到的页面跳转问题

    问题一:页面自动跳转到 80 端口 问题描述 最近在使用Nginx反代一个Spring Boot项目中碰到了一个问题,使用 Spring Boot 中的 redirect: 进行页面跳转的时候,通过 ...

  8. 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】

    最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题 ...

  9. td中使用overflow:hidden; 无效解决方案

    td中使用overflow:hidden; 无效解决方案 >>>>>>>>>>>>>>>>>> ...

  10. GEF-whole-upload教程中遇到的问题及解决方案

    最近在学习GEF开发,使用的是GEF-whole-upload这个教程.由于教程当时所使用的版本与本人使用的版本有一些差异,中间出现了不少问题,现在将解决方案分享给大家. 本人使用的Eclipse版本 ...

随机推荐

  1. ThreeJs-07操控物体实现家具编辑器

    本章节实现效果,通过gui快速添加场景,家具,并且可以快速设置家具实现一个编辑器效果 一.基础设置与物体添加列表 用之前做过的一个案例来改 首先不要这个模型,然后换个背景颜色,并且添加一个网格辅助器 ...

  2. WinDbg: Failed to find runtime module (coreclr.dll or clr.dll or libcoreclr.so)

    当我们通过 WinDbg 启动一个 .NET 的程序时,WinDbg 将会在运行可执行之前执行一个中断,此时还没有加载 .NET 的运行时. 但是,SOS 扩展需要 clr.dll 或者 corecl ...

  3. TokenService

    https://github.com/ng-alain/delon/blob/master/packages/auth/src/token/token.service.ts set(data: ITo ...

  4. 在TOMCAT8.5使用 JOSSO 单点登录(Agent 端)

    网上找到的玩法都是用 josso 给的命令行工具加工 tomcat,这个办法有不少问题: 1. tomcat8.5 还不支持 2. 很难配置,这让我险些放弃 tomcat8.5,用 tomcat8,但 ...

  5. [转]CMake学习笔记(一)基本概念介绍、入门教程及CLion安装配置

    原文链接:CMake学习笔记(一)基本概念介绍.入门教程及CLion安装配置

  6. java中基于swing库自定义分页组件

    一个swing的分页组件,代码见附件. //用法如下:  Class Test{      JTable table ;      StatusBar statusBar ;      Test(){ ...

  7. 痞子衡嵌入式:Farewell, 我的写博故事2024

    -- 题图:苏州周庄古镇双桥 2024 年的最后一天,照旧写个年终总结.今年工作上稳步发挥,但是在生活上收获了一个新的爱好,大家可能知道,痞子衡比较爱运动,一直有在打篮球羽毛球桌球.有感于公司乒乓球文 ...

  8. AI实战营第二期 | 环境配置及安装

    AI实战营第二期 | 环境配置及安装 强烈推荐使用 mim 来管理 OpenMMLab repo OpenMMLab repo 不要 mim 和 pip 混用 OpenMMLab 1.0 和 Open ...

  9. preparation

    课程知识准备 HTML5基础教程 CSS3基础教程 JavaScript基础教程 HTML DOM基础教程 VUE3基础教程 Element Plus OpenLayers vue3-openlaye ...

  10. Python在多个Excel文件中找出缺失数据行数多的文件

      本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件内.某一列数据的特征,对其加以筛选,并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法. ...