Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO

            <div id="content_views" class="htmledit_views">
                <p></p> 

官网:https://streamlit.io/
github:https://github.com/streamlit/streamlit
API 参考:https://docs.streamlit.io/library/api-reference
最全 Streamlit 教程:https://juejin.cn/column/7265946243196436520
Streamlit-中文文档:https://github.com/wanghanbinpanda/Streamlit-Documentation-Chinese/blob/main/README.md

1、Python web GUI 框架

Gradio、Streamlit、Dash、nicegui

框架对比:Gradio、Streamlit 和 Dash:https://zhuanlan.zhihu.com/p/611828558

在机器学习领域,针对已经训练好的模型创建一个快速的 Demo 通常是必要的,下面是快速创建机器学习应用的几个框架:gradiostreamit 和 dash 进行简单的对比。

gradiostreamitdash
主要使用场景可交互小 Demo工作流、DashBoardDashBoard、生产环境的复杂演示应用
上手难度简单简单中等
组件丰富度
综合扩展性
Jupyter Notebook 内支持
是否完全开源部分企业级功能未开源
github stars13.4k23.1k18.2k
案例列表GitHub - gradio-app/awesome-demos: links and status of cool gradio demosApp Gallery • StreamlitDash Enterprise

2、nicegui

官网:https://nicegui.io/
github:https://github.com/zauberzeug/nicegui/
nicegui 中文文档:nicegui-reference-cnhttps://zhuanlan.zhihu.com/p/661187865
在 Python 3.10 及更高版本中,collections模块被重构,MutableMapping 已经被弃用。
安装:pip install nicegui
NiceGUI 基于FastAPI,封装了Quasar、Vue、Tailwind CSS、AG Grid、ECharts等,可以用来快速开发web或桌面程序。

示例代码


 
 
  1. from nicegui import ui
  2. ui.icon( 'thumb_up')
  3. ui.markdown( 'This is **Markdown**.')
  4. ui.html( 'This is <strong>HTML</strong>.')
  5. with ui.row():
  6. ui.label( 'CSS').style( 'color: #888; font-weight: bold')
  7. ui.label( 'Tailwind').classes( 'font-serif')
  8. ui.label( 'Quasar').classes( 'q-ml-xl')
  9. ui.link( 'NiceGUI on GitHub', 'https://github.com/zauberzeug/nicegui')
  10. ui.run()

执行结果

示例:


 
 
  1. from nicegui import ui
  2. ui.label( 'Hello NiceGUI!')
  3. ui.button( 'BUTTON', on_click= lambda: ui.notify( 'button was pressed'))
  4. ui.run()

nicegui 中文文档

nicegui-reference-cn:https://zhuanlan.zhihu.com/p/661187865

一、基础元素
    1、标签
    2、图标
    3、头像
    4、链接
    5、按钮
    6、徽章
    7、切换
    8、单选选择
    9、下拉选择
    10、复选框
    11、开关
    12、滑块
    13、操纵杆
    14、文本输入
    15、文本框
    16、数字输入
    17、旋钮
    18、颜色输入
    19、颜色选择器
    20、日期输入
    21、时间输入
    22、文件上传
    23、聊天消息
    24、通用元素
二、标记语言
    1、Markdown 元素
    2、Mermaid 图表
    3、HTML 元素
    4、SVG
三、图片,音频和视频
    1、图像
    2、标题和叠加
    3、交互式图像
    4、音频
    5、视频
四、数据元素
    1、表格
    2、AG Grid (大数据)
    3、图表
    4、Apache EChart
    5、Pyplot 上下文
    6、线性图
    7、Plotly 元素
    8、线性进度条
    9、圆形进度条
    10、旋转器
    11、3D 场景
    12、树状结构
    13、日志视图
    14、编辑器
    15、代码
    16、JSON编辑器
五、布局
    1、卡片
    2、列元素
    3、行元素
    4、网格元素
    5、清除容器内容
    6、展开元素
    7、滚动区域
    8、分隔符
    9、分割器
    10、标签页
    11、步进器
    12、时间线
    13、走马灯
    14、菜单
    15、工具提示
    16、通知
    17、对话框

3、streamlit

streamlit 简介

Streamlit 是Python可视化 web 神器 ,是一个开箱即用的工具集,可以让开发者免于学习繁杂的前端知识,仅需几行代码就可以轻松、快速的构建一个简洁、优雅、令人惊叹的可视化 web app 应用。用于机器学习、数据可视化。当快速搭建一个 web app 的时候 Streamlit 绝对是开发神器。

Streamlit 工作流程

https://docs.streamlit.io/get-started/fundamentals/summary

  1. Streamlit 应用程序是从上到下运行的Python脚本
  2. 对于用户的每一次交互,整个脚本从头到尾执行一遍
  3. 当脚本执行时,Streamlit 在浏览器中实时绘制其输出
  4. Streamlit 使用缓存来避免重复请求数据或重复计算
  5. 每次用户与小部件交互时脚本都会重新执行,在该运行期间该小组件的输出值将重新设置。
  6. Streamlit 应用可以包含多个页面,这些页面在pages文件夹中的单独.py文件中定义。

简单 使用

安装:pip install -i https://pypi.douban.com/simple  streamlit

Streamlit 提供了一些入门示例,执行命令即可:streamlit hello

执行后会自动打开浏览器加载一个本地页面 http://localhost:8501/

这里面有很多的 demo,可以看下这些 Demo 还有对应的配套代码。代码直接拷贝保存,就可以在本地直接通过如下命令直接运行:streamlit run st-demo.py

Streamlit 使用 速查表

  1. Install & Import 安装和导入
  2. Command line 命令行
  3. Pre-release features 预发布功能
  4. Magic commands 魔术命令
  5. Display text 显示文本
  6. Display data 显示数据
  7. Display media 显示媒体
  8. Display charts 显示图表
  9. Add widgets to sidebar 将小部件添加到侧边栏
  10. Columns 列
  11. Tabs 制表符
  12. Control flow 控制流
  13. Display interactive widgets显示交互式小部件
  14. Build chat-based apps 构建基于聊天的应用
  15. Mutate data 更改数据
  16. Display code 显示代码
  17. Placeholders, help, and options占位符、帮助和选项
  18. Connect to data sources连接到数据源
  19. Optimize performance 优化性能
  20. Cache data objects 缓存数据对象

怎么运行 Streamlit 

https://docs.streamlit.io/knowledge-base/using-streamlit/how-do-i-run-my-streamlit-script

运行 streamlit 方法:( Ctrl + c 结束运行 )

  • 方法 1:streamlit run your_script.py [-- script args]
  • 方法 2:streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/streamlit_app.py
  • 方法 3:python -m streamlit run your_script.py
  • 方法 4:streamlit run your_script.py

 
 
  1. import sys
  2. import streamlit as st
  3. from streamlit import runtime
  4. from streamlit.web import cli as stcli
  5. def my_web_app():
  6. # markdown
  7. st.markdown( 'Streamlit markdown')
  8. st.header( 'Streamlit Demo')
  9. def main():
  10. if runtime.exists():
  11. my_web_app()
  12. else:
  13. sys.argv = [ "streamlit", "run", sys.argv[ 0]]
  14. sys.exit(stcli.main())
  15. if __name__ == '__main__':
  16. main()

Python 直接执行:python temp_test.py

浏览器中直接访问 URL 

Markdown 文本

导入 streamlit 后,就可以直接使用 st.markdown() 初始化,调用不同的方法,就可以往文档对象中填入内容

  • st.title():文章大标题
  • st.header():一级标题
  • st.subheader():二级标题
  • st.text():文本
  • st.code():代码,同时可设置代码的语言,显示的时候会高亮
  • st.latex():latex 公式
  • st.caption():小字体文本

示例:


 
 
  1. import streamlit as st
  2. # markdown
  3. st.markdown( 'Streamlit Demo')
  4. # 设置网页标题
  5. st.title( '一个傻瓜式构建可视化 web的 Python 神器 -- streamlit')
  6. # 展示一级标题
  7. st.header( '1. 安装')
  8. st.text( '和安装其他包一样,安装 streamlit 非常简单,一条命令即可')
  9. code1 = '''pip3 install streamlit'''
  10. st.code(code1, language= 'bash')
  11. # 展示一级标题
  12. st.header( '2. 使用')
  13. # 展示二级标题
  14. st.subheader( '2.1 生成 Markdown 文档')
  15. # 纯文本
  16. st.text( '导入 streamlit 后,就可以直接使用 st.markdown() 初始化')
  17. # 展示代码,有高亮效果
  18. code2 = '''import streamlit as st
  19. st.markdown('Streamlit Demo')'''
  20. st.code(code2, language= 'python')

Streamlit 运行的方式 与普通的脚本 有所不同,命令行执行:streamlit run st-demo.py

数据 图表

关于数据的展示,streamlit 由两个组件进行支持

  • table:普通的表格,用于静态数据的展示
  • dataframe:高级的表格,可以进行数据的操作,比如排序

表格

Table 的示例


 
 
  1. df = pd.DataFrame(
  2. np.random.randn( 10, 5),
  3. columns=( '第%d列' % (i+ 1) for i in range( 5))
  4. )
  5. st.table(df)

Datafram 的示例


 
 
  1. df = pd.DataFrame(
  2. np.random.randn( 10, 5),
  3. columns=( '第%d列' % (i+ 1) for i in range( 5))
  4. )
  5. st.dataframe(df.style.highlight_max(axis= 0))

其实还有 n 多种样式,都可以在源代码中找到示例,比如:

  • highlight_null:空值高亮
  • highlight_min:最小值高亮
  • highlight_max:最大值高亮
  • highlight_between:某区间内的值高亮
  • highlight_quantile:暂没用过

监控组件

在采集到一些监控数据后,若你需要做一个监控面板, streamlit 也为你提供的 metric 组件

示例:创建 三个指标,并且填入对应的数据


 
 
  1. col1, col2, col3 = st.columns( 3)
  2. col1.metric( "Temperature", "70 °F", "1.2 °F")
  3. col2.metric( "Wind", "9 mph", "-8%")
  4. col3.metric( "Humidity", "86%", "4%")

刷新页面,就能看到下面的效果

原生图表组件

Streamlit 原生支持多种图表:

  • st.line_chart:折线图
  • st.area_chart:面积图
  • st.bar_chart:柱状图
  • st.map:地图

折线图


 
 
  1. chart_data = pd.DataFrame(
  2. np.random.randn( 20, 3),
  3. columns=[ 'a', 'b', 'c'])
  4. st.line_chart(chart_data)

面积图


 
 
  1. chart_data = pd.DataFrame(
  2. np.random.randn( 20, 3),
  3. columns = [ 'a', 'b', 'c'])
  4. st.area_chart(chart_data)

柱状图


 
 
  1. chart_data = pd.DataFrame(
  2. np.random.randn( 50, 3),
  3. columns = [ "a", "b", "c"])
  4. st.bar_chart(chart_data)

地图


 
 
  1. df = pd.DataFrame(
  2. np.random.randn( 1000, 2) / [ 50, 50] + [ 37.76, - 122.4],
  3. columns=[ 'lat', 'lon']
  4. )
  5. st. map(df)

外部图表组件

Streamlit 的一些原生图表组件,虽然做到了傻瓜式,但仅能输入数据、高度和宽度,如果你想更漂亮的图表,就像 matplotlib.pyplot、Altair、vega-lite、Plotly、Bokeh、PyDeck、Graphviz 那样,streamlit 也提供了支持:

  • st.pyplot
  • st.bokeh_chart
  • st.altair_chart
  • st.altair_chart
  • st.vega_lite_chart
  • st.plotly_chart
  • st.pydeck_chart
  • st.graphviz_chart

用户 交互 操作

前面都只是展示文本和数据,streamlit  还能写一些交互界面。平时在网页上、app 上能看到的交互组件,Streamlit 几乎都能支持。。

  • button:按钮
  • download_button:文件下载
  • file_uploader:文件上传
  • checkbox:复选框
  • radio:单选框
  • selectbox:下拉单选框
  • multiselect:下拉多选框
  • slider:滑动条
  • select_slider:选择条
  • text_input:文本输入框
  • text_area:文本展示框
  • number_input:数字输入框,支持加减按钮
  • date_input:日期选择框
  • time_input:时间选择框
  • color_picker:颜色选择器

这些内容非常多,也比较简单,可以直接去看 streamlit 源码里的注释即可。

页面之间数据共享

Session State是Streamlit中用于在不同页面之间传递和保存状态数据的一种机制。通过Session State,我们可以在应用程序的整个生命周期中维护和访问特定于会话的变量。这意味着我们可以在不同页面之间共享和使用相同的变量值,从而实现多页面之间的交互和数据传递。

优点:

  • 简单易用:Streamlit的Session State机制使得在不同页面之间传递和保存状态数据变得非常简单。只需使用字典来存储和访问状态数据,无需复杂的配置或额外的库。
  • 跨页面数据共享:通过Session State,我们可以在应用程序的整个生命周期中保存和访问特定于会话的变量。这使得在多个页面之间共享数据变得轻松,可以传递复杂的数据结构,如字典、列表等。
  • 可扩展性:使用Session State,我们可以轻松地在应用程序中添加新的页面,并在不同页面之间保持数据的一致性。这使得应用程序更易于管理和维护,可以随着需求的增长进行扩展和修改。
  • 状态持久化:通过Streamlit的Session State机制,我们可以在刷新应用程序或重新运行应用程序时保留状态数据。这对于用户来说非常方便,他们可以在应用程序的不同会话之间保持他们的工作状态。

缺点:

  • 内存消耗:由于Session State数据存储在内存中,当应用程序的状态数据变得庞大时,内存消耗可能会较大。这可能会限制应用程序的可伸缩性和性能。
  • 无持久化方案:Session State数据存储在应用程序的内存中,并且仅在应用程序运行期间存在。因此,当应用程序停止运行或重新启动时,Session State数据将丢失。如果需要长期存储数据,需要使用其他机制,如数据库或文件系统。
  • 难以调试:由于Session State是在应用程序的多个页面之间传递和共享数据,当出现问题时,追踪和调试可能会比较困难。特别是在复杂的多页面应用程序中,正确地处理和管理Session State变量可能会变得复杂。

多页面

方法 1:通过 pages 文件夹 (推荐)

官网 多页 文档:https://docs.streamlit.io/library/advanced-features/multipage-apps

在单个py文件中,如果每个应用 "页面" 都编写为一个函数,选择框用于选择要显示的页面。随着应用的发展,维护代码需要大量额外的开销。此外,由于受 st.selectbox UI 的限制,无法选择要运行的“页面”,也无法自定义 st.set_page_config 单个页面标题,也无法使用 URL 在页面之间导航。所以,需要将现有应用程序转换为多页应用程序,Streamlit 提供了一种创建多页应用程序的方式。示例:向现有应用添加更多页面:

  1. 假设您的主脚本名为 main_page.py,在同级目录下创建一个新文件夹 pages,Streamlit 在 pages 文件夹中找到的其他脚本将出现在侧边栏中显示的新页面选择器中。
  2. 在 pages 文件夹中添加新文件 .py 以向应用添加更多页面 pages。在文件名中添加表情符号时,最佳做法是包含编号前缀。只有 pages/ 目录中的 .py 文件才会作为页面加载。Streamlit 忽略 pages/ 目录和子目录中的所有其他文件。页面会自动显示在应用程序侧边栏内漂亮的导航 UI 中。当您单击侧边栏 UI 中的页面时,Streamlit 会导航到该页面,而无需重新加载整个前端。可以在两个 page 之间用 URL进行导航,page通过文件的label来定义有自己的url,当多个页面有相同的label,streamlit会根据排序规则选取第一个。可以通过page的url访问对应的page
  3. 运行 streamlit run main_page.py

多页应用的文档将教你如何向应用添加页面,包括如何定义页面、构建和运行多页应用以及在页面之间导航。了解基础知识后,创建您的第一个多页应用程序

main.py,在页面显示 main。( 可以改成 Home.py,在页面可以显示 Home )


 
 
  1. import sys
  2. import streamlit as st
  3. from streamlit import runtime
  4. from streamlit.web import cli as stcli
  5. def my_web_app():
  6. st.set_page_config(
  7. page_title= "Hello",
  8. page_icon= "👋",
  9. )
  10. st.write( "# Welcome to Streamlit! 👋")
  11. st.sidebar.success( "Select a demo above.")
  12. st.markdown(
  13. """
  14. Streamlit is an open-source app framework built specifically for
  15. Machine Learning and Data Science projects.
  16. **👈 Select a demo from the sidebar** to see some examples
  17. of what Streamlit can do!
  18. ### Want to learn more?
  19. - Check out [streamlit.io](https://streamlit.io)
  20. - Jump into our [documentation](https://docs.streamlit.io)
  21. - Ask a question in our [community
  22. forums](https://discuss.streamlit.io)
  23. ### See more complex demos
  24. - Use a neural net to [analyze the Udacity Self-driving Car Image
  25. Dataset](https://github.com/streamlit/demo-self-driving)
  26. - Explore a [New York City rideshare dataset](https://github.com/streamlit/demo-uber-nyc-pickups)
  27. """
  28. )
  29. def main():
  30. if runtime.exists():
  31. my_web_app()
  32. else:
  33. sys.argv = [ "streamlit", "run", sys.argv[ 0]]
  34. sys.exit(stcli.main())
  35. if __name__ == '__main__':
  36. main()

创建多个页面

  • 可以通过在每个 Python 文件的开头添加数字来更改 MPA 中页面的顺序。如果我们在文件名的前面添加一个 1,Streamlit 会将该文件放在列表中的第一位。
  • 每个 Streamlit 应用程序的名称由文件名决定,更改应用程序名称时,需要更改文件名!
  • 可以通过在文件名中添加表情符号来为我们的应用程序增添一些乐趣,这些表情符号将在我们的 Streamlit 应用程序中呈现。
  • 每个页面都有自己的 URL,由文件名定义。

效果如图:

pages/1_📈_Plotting_Demo.py


 
 
  1. import streamlit as st
  2. import time
  3. import numpy as np
  4. st.set_page_config(page_title= "Plotting Demo", page_icon= "📈")
  5. st.markdown( "# Plotting Demo")
  6. st.sidebar.header( "Plotting Demo")
  7. st.write(
  8. """This demo illustrates a combination of plotting and animation with
  9. Streamlit. We're generating a bunch of random numbers in a loop for around
  10. 5 seconds. Enjoy!"""
  11. )
  12. progress_bar = st.sidebar.progress( 0)
  13. status_text = st.sidebar.empty()
  14. last_rows = np.random.randn( 1, 1)
  15. chart = st.line_chart(last_rows)
  16. for i in range( 1, 101):
  17. new_rows = last_rows[- 1, :] + np.random.randn( 5, 1).cumsum(axis= 0)
  18. status_text.text( "%i%% Complete" % i)
  19. chart.add_rows(new_rows)
  20. progress_bar.progress(i)
  21. last_rows = new_rows
  22. time.sleep( 0.05)
  23. progress_bar.empty()
  24. # Streamlit widgets automatically run the script from top to bottom. Since
  25. # this button is not connected to any other logic, it just causes a plain
  26. # rerun.
  27. st.button( "Re-run")

pages/2_🌍_Mapping_Demo.py


 
 
  1. import streamlit as st
  2. import pandas as pd
  3. import pydeck as pdk
  4. from urllib.error import URLError
  5. st.set_page_config(page_title= "Mapping Demo", page_icon= "🌍")
  6. st.markdown( "# Mapping Demo")
  7. st.sidebar.header( "Mapping Demo")
  8. st.write(
  9. """This demo shows how to use
  10. [`st.pydeck_chart`](https://docs.streamlit.io/library/api-reference/charts/st.pydeck_chart)
  11. to display geospatial data."""
  12. )
  13. @st.cache_data
  14. def from_data_file( filename):
  15. url = (
  16. "http://raw.githubusercontent.com/streamlit/"
  17. "example-data/master/hello/v1/%s" % filename
  18. )
  19. return pd.read_json(url)
  20. try:
  21. ALL_LAYERS = {
  22. "Bike Rentals": pdk.Layer(
  23. "HexagonLayer",
  24. data=from_data_file( "bike_rental_stats.json"),
  25. get_position=[ "lon", "lat"],
  26. radius= 200,
  27. elevation_scale= 4,
  28. elevation_range=[ 0, 1000],
  29. extruded= True,
  30. ),
  31. "Bart Stop Exits": pdk.Layer(
  32. "ScatterplotLayer",
  33. data=from_data_file( "bart_stop_stats.json"),
  34. get_position=[ "lon", "lat"],
  35. get_color=[ 200, 30, 0, 160],
  36. get_radius= "[exits]",
  37. radius_scale= 0.05,
  38. ),
  39. "Bart Stop Names": pdk.Layer(
  40. "TextLayer",
  41. data=from_data_file( "bart_stop_stats.json"),
  42. get_position=[ "lon", "lat"],
  43. get_text= "name",
  44. get_color=[ 0, 0, 0, 200],
  45. get_size= 15,
  46. get_alignment_baseline= "'bottom'",
  47. ),
  48. "Outbound Flow": pdk.Layer(
  49. "ArcLayer",
  50. data=from_data_file( "bart_path_stats.json"),
  51. get_source_position=[ "lon", "lat"],
  52. get_target_position=[ "lon2", "lat2"],
  53. get_source_color=[ 200, 30, 0, 160],
  54. get_target_color=[ 200, 30, 0, 160],
  55. auto_highlight= True,
  56. width_scale= 0.0001,
  57. get_width= "outbound",
  58. width_min_pixels= 3,
  59. width_max_pixels= 30,
  60. ),
  61. }
  62. st.sidebar.markdown( "### Map Layers")
  63. selected_layers = [
  64. layer
  65. for layer_name, layer in ALL_LAYERS.items()
  66. if st.sidebar.checkbox(layer_name, True)
  67. ]
  68. if selected_layers:
  69. st.pydeck_chart(
  70. pdk.Deck(
  71. map_style= "mapbox://styles/mapbox/light-v9",
  72. initial_view_state={
  73. "latitude": 37.76,
  74. "longitude": - 122.4,
  75. "zoom": 11,
  76. "pitch": 50,
  77. },
  78. layers=selected_layers,
  79. )
  80. )
  81. else:
  82. st.error( "Please choose at least one layer above.")
  83. except URLError as e:
  84. st.error(
  85. """
  86. **This demo requires internet access.**
  87. Connection error: %s
  88. """
  89. % e.reason
  90. )

pages/3_📊_DataFrame_Demo.py


 
 
  1. import streamlit as st
  2. import pandas as pd
  3. import altair as alt
  4. from urllib.error import URLError
  5. st.set_page_config(page_title= "DataFrame Demo", page_icon= "📊")
  6. st.markdown( "# DataFrame Demo")
  7. st.sidebar.header( "DataFrame Demo")
  8. st.write(
  9. """This demo shows how to use `st.write` to visualize Pandas DataFrames.
  10. (Data courtesy of the [UN Data Explorer](http://data.un.org/Explorer.aspx).)"""
  11. )
  12. @st.cache_data
  13. def get_UN_data():
  14. AWS_BUCKET_URL = "http://streamlit-demo-data.s3-us-west-2.amazonaws.com"
  15. df = pd.read_csv(AWS_BUCKET_URL + "/agri.csv.gz")
  16. return df.set_index( "Region")
  17. try:
  18. df = get_UN_data()
  19. countries = st.multiselect(
  20. "Choose countries", list(df.index), [ "China", "United States of America"]
  21. )
  22. if not countries:
  23. st.error( "Please select at least one country.")
  24. else:
  25. data = df.loc[countries]
  26. data /= 1000000.0
  27. st.write( "### Gross Agricultural Production ($B)", data.sort_index())
  28. data = data.T.reset_index()
  29. data = pd.melt(data, id_vars=[ "index"]).rename(
  30. columns={ "index": "year", "value": "Gross Agricultural Product ($B)"}
  31. )
  32. chart = (
  33. alt.Chart(data)
  34. .mark_area(opacity= 0.3)
  35. .encode(
  36. x= "year:T",
  37. y=alt.Y( "Gross Agricultural Product ($B):Q", stack= None),
  38. color= "Region:N",
  39. )
  40. )
  41. st.altair_chart(chart, use_container_width= True)
  42. except URLError as e:
  43. st.error(
  44. """
  45. **This demo requires internet access.**
  46. Connection error: %s
  47. """
  48. % e.reason
  49. )

注意:

  • page 支持 magic commands.
  • 页面支持保存时运行。此外,当您保存页面时,这会导致当前正在查看该页面的用户重新运行。
  • 添加或删除页面会导致 UI 立即更新。
  • 更新边栏中的页面不会重新运行脚本。
  • st.set_page_config 在页面级别工作。当您使用st.set_page_config设置标题或图标时,这仅适用于当前页面。
  • 页面在全局范围内共享相同的 Python 模块:
    
       
       
    1. # page1.py
    2. import foo
    3. foo.hello = 123
    4. # page2.py
    5. import foo
    6. st.write(foo.hello) # 如果 page1 已经执行,这里将会输出 123
  • 页面共享相同的  st.session_state:
    
       
       
    1. # page1.py
    2. import streamlit as st
    3. if "shared" not in st.session_state:
    4. st.session_state[ "shared"] = True
    5. # page2.py
    6. import streamlit as st
    7. st.write(st.session_state[ "shared"])
    8. # If page1 already executed, this should write True

方法 2:通过函数中的 if else

在使用Session State构建多页面应用之前,让我们先了解一下多页面应用的基本结构。一个典型的多页面应用通常包括以下几个组成部分:

  • 导航栏:用于切换页面的导航栏,可以是按钮、链接或下拉菜单等形式。
  • 页面内容:不同页面的具体内容和功能模块,可以通过导航栏进行切换。
  • 状态管理:保持和管理不同页面之间的状态数据,确保用户在切换页面时数据不会丢失。

 
 
  1. import sys
  2. import streamlit as st
  3. from streamlit import runtime
  4. from streamlit.web import cli as stcli
  5. def my_web_app():
  6. # 设置初始页面为Home
  7. session_state = st.session_state
  8. session_state[ 'page'] = 'Home'
  9. # 导航栏
  10. page = st.sidebar.radio( 'Navigate', [ 'Home', 'About'])
  11. if page == 'Home':
  12. st.title( 'Home Page')
  13. # 在Home页面中显示数据和功能组件
  14. elif page == 'About':
  15. st.title( 'About Page')
  16. # 在About页面中显示数据和功能组件
  17. def main():
  18. if runtime.exists():
  19. my_web_app()
  20. else:
  21. sys.argv = [ "streamlit", "run", sys.argv[ 0]]
  22. sys.exit(stcli.main())
  23. if __name__ == '__main__':
  24. main()

方法 3:通过 函数

如果页面内容构建的太过复杂,单纯的 if-else 语句已经无法满足应用的构建需求,这时候可以使用函数来构建。


 
 
  1. import sys
  2. import streamlit as st
  3. from streamlit import runtime
  4. from streamlit.web import cli as stcli
  5. def page_home():
  6. st.title( 'Home Page')
  7. # 在Home页面中显示数据和功能组件
  8. def page_about():
  9. st.title( 'About Page')
  10. # 在About页面中显示数据和功能组件
  11. def my_web_app():
  12. # 设置初始页面为Home
  13. session_state = st.session_state
  14. if 'page' not in session_state:
  15. session_state[ 'page'] = 'Home'
  16. # 导航栏
  17. page = st.sidebar.radio( 'Navigate', [ 'Home', 'About'])
  18. if page == 'Home':
  19. page_home()
  20. elif page == 'About':
  21. page_about()
  22. def main():
  23. if runtime.exists():
  24. my_web_app()
  25. else:
  26. sys.argv = [ "streamlit", "run", sys.argv[ 0]]
  27. sys.exit(stcli.main())
  28. if __name__ == '__main__':
  29. main()

组件/控件

如何使用组件,首先找到要使用的组件。两个很好的组件库:

例如,要使用出色的 AgGrid 组件,首先安装:pip install streamlit-aggrid


 
 
  1. from st_aggrid import AgGrid
  2. import pandas as pd
  3. df = pd.read_csv( 'https://raw.githubusercontent.com/fivethirtyeight/data/master/airline-safety/airline-safety.csv')
  4. AgGrid(df)

执行命令:streamlit run example.py

组件 API 参考
  1. Display almost anything 显示几乎任何东西
  2. Text elements 文本元素
  3. Data elements 数据元素
  4. Chart elements 图表元素
  5. Input widgets 输入小部件
  6. Media elements 媒体元素
  7. Layouts and containers 布局和容器
  8. Chat elements 聊天元素
  9. Display progress and status显示进度和状态
  10. Control flow 控制流
  11. Developer tools 开发人员工具
  12. Utilities 公用事业
  13. Mutate charts 变异图表
  14. State management 状态管理
  15. Connections and databases连接和数据库
  16. Performance 性能
  17. Connections and databases连接和数据库
  18. Setup your connection 设置连接
  19. Built-in connections 内置连接
  20. Third-party connections 第三方连接
  21. Personalization 个性化
  22. App testing 应用测试

高级功能

用户登录

Streamlit-Authenticator:https://github.com/mkhorasani/Streamlit-Authenticator

pypi:https://pypi.org/project/streamlit-authenticator/

一个安全身份验证模块,用于验证 Streamlit 应用程序中的用户凭据。更多使用方法参看 github


 
 
  1. import streamlit as st
  2. import streamlit_authenticator as stauth
  3. def login_success():
  4. container = st.container()
  5. # create a prompt text for the text generation
  6. prompt_text = st.text_area(
  7. label= "用户命令输入",
  8. height= 100,
  9. placeholder= "请在这儿输入您的命令"
  10. )
  11. # 其他语句...
  12. def main():
  13. # 用户信息,后续可以来自DB
  14. names = [ '普通用户', '管理员'] # 用户名
  15. usernames = [ 'user_king', 'user_admin'] # 登录名
  16. passwords = [ 'user_king_passwd', 'user_admin_passwd'] # 登录密码
  17. # 对密码进行加密操作,后续将这个存放在credentials中
  18. hashed_passwords = stauth.Hasher(passwords).generate()
  19. # 定义字典,初始化字典
  20. credentials = { 'usernames': {}}
  21. # 生成服务器端的用户身份凭证信息
  22. for i in range( 0, len(names)):
  23. credentials[ 'usernames'][usernames[i]] = { 'name': names[i], 'password': hashed_passwords[i]}
  24. authenticator = stauth.Authenticate(credentials, 'some_cookie_name', 'some_signature_key', cookie_expiry_days= 0)
  25. name, authentication_status, username = authenticator.login( 'Login', 'main')
  26. if authentication_status: # 登录成功
  27. login_success()
  28. elif not authentication_status: # 登录失败
  29. st.error( 'Username/password is incorrect')
  30. elif authentication_status is None: # 未输入登录信息
  31. st.warning( 'Please enter your username and password')
  32. if __name__ == "__main__":
  33. main()

使用 Streamlit 进行 Web 应用程序开发

多媒体 组件/控件

想要在页面上播放图片、音频和视频,可以使用 streamlit 的这三个组件:

  • st.image
  • st.audio
  • st.video

状态 组件

状态组件用来向用户展示当前程序的运行状态,包括:

  • progress:进度条,如游戏加载进度
  • spinner:等待提示
  • balloons:页面底部飘气球,表示祝贺
  • error:显示错误信息
  • warning:显示报警信息
  • info:显示常规信息
  • success:显示成功信息
  • exception:显示异常信息(代码错误栈)

页面 布局

Streamlit 是自上而下渲染的,组件在页面上的排列顺序与代码的执行顺序一致。一个精美的 web app ,只有上下单栏式的布局肯定是不够的。实际上 streamlit 还提供了多种多样的布局:

st.sidebar:侧边栏。侧边栏可以做一些用户操作控件

  • st.columns:列容器,处在同一个 columns 内组件,按照从左至右顺序展示
  • st.expander:隐藏信息,点击后可展开展示详细内容,如:展示更多
  • st.container:包含多组件的容器
  • st.empty:包含单组件的容器

容器:st.sidebar 侧边栏

Streamlit 提供了强大的 st.sidebar 组件。借助于这个组件,可以轻松地将小部件(widgets)放置在应用页面的侧边栏位置。将交互元素添加至侧边栏。可以使用对象表示法(object notation)或者 with 语法将元素添加到 st.sidebar。两者的效果是一样的,只是语法不同。以下是两种添加元素的方式:


 
 
  1. # 使用对象表示法
  2. st.sidebar.[element_name]
  3. # "with" 语法
  4. with st.sidebar:
  5. st.[element_name]

通过将元素添加至 st.sidebar,这些元素会被固定在侧边栏的左侧,让用户可以轻松地浏览和交互。

示例:在侧边栏添加选择框和单选按钮


 
 
  1. import streamlit as st
  2. # 使用对象表示法添加选择框
  3. add_selectbox = st.sidebar.selectbox(
  4. "您希望如何联系您?",
  5. ( "电子邮件", "家庭电话", "移动电话")
  6. )
  7. # 使用“with”语法添加单选按钮
  8. with st.sidebar:
  9. add_radio = st.radio(
  10. "选择一种运输方式",
  11. ( "标准(5-15天)", "快递(2-5天)")
  12. )

  • 侧边栏是可调整大小的!拖放侧边栏的右边框以调整其大小!
  • 不支持使用对象表示法的唯一元素是 st.echo 、 st.spinner 和 st.toast 。若要使用这些元素,必须使用 with 表示法。

以下是如何在侧边栏中添加 st.echo 和 st.spinner 的示例:


 
 
  1. import streamlit as st
  2. import time
  3. with st.sidebar:
  4. with st.echo():
  5. st.write( "这段代码将在侧边栏中显示。")
  6. with st.spinner( "加载中..."):
  7. time.sleep( 5)
  8. st.success( "完成!")

通过充分利用 st.sidebar,您可以将交互元素整齐地组织在应用的侧边栏,提供更加直观和便捷的用户体验。

容器:st.columns 并排多列 

st.columns 返回一个容器对象的列表,可以在这些容器对象中添加元素。每个对象都可以用来添加元素。您可以选择使用“with”语法(更推荐)或者直接在容器对象上调用方法来添加元素。以下是示例代码:


 
 
  1. import sys
  2. import streamlit as st
  3. from streamlit import runtime
  4. from streamlit.web import cli as stcli
  5. def layout_column():
  6. col1, col2, col3 = st.columns( 3)
  7. with col1:
  8. st.header( "一只猫")
  9. st.image( "https://static.streamlit.io/examples/cat.jpg")
  10. with col2:
  11. st.header( "一只狗")
  12. st.image( "https://static.streamlit.io/examples/dog.jpg")
  13. with col3:
  14. st.header( "一只猫头鹰")
  15. st.image( "https://static.streamlit.io/examples/owl.jpg")
  16. def main():
  17. if runtime.exists():
  18. # layout_sidebar()
  19. layout_column()
  20. else:
  21. sys.argv = [ "streamlit", "run", sys.argv[ 0]]
  22. sys.exit(stcli.main())
  23. if __name__ == '__main__':
  24. main()

按百分比设置列大小,在容器对象上调用方法:


 
 
  1. import streamlit as st
  2. import numpy as np
  3. col1, col2 = st.columns([ 3, 1])
  4. data = np.random.randn( 10, 1)
  5. col1.subheader( "一个宽容器,含有图表")
  6. col1.line_chart(data)
  7. col2.subheader( "一个窄容器,含有数据")
  8. col2.write(data)

列不能放在边栏中的其他列中。只能在应用程序的主要区域进行。列只能放置在其他列中,最多嵌套一个级别。也就是说,您可以将多个容器放置在主要内容区域内,但不能将多元素容器嵌套在其他多元素容器内。此外,请注意,不能将多元素容器嵌套在侧边栏的容器内,这只能在应用程序的主要区域中实现。通过合理地运用 st.columns,您可以轻松地实现并排布局的多元素容器,提供更清晰和直观的界面效果,增强用户体验。

容器:st.tabs - 选项卡布局

 
 
  1. import sys
  2. import streamlit as st
  3. from streamlit import runtime
  4. from streamlit.web import cli as stcli
  5. import numpy as np
  6. def layout_tab():
  7. tab1, tab2, tab3, tab4, tab5, tab6 = st.tabs([ "猫", "狗", "猫头鹰", "测试多列", "图表", "数据"])
  8. data = np.random.randn( 10, 1)
  9. with tab1:
  10. st.header( "一只猫")
  11. st.image( "https://static.streamlit.io/examples/cat.jpg", width= 200)
  12. with tab2:
  13. st.header( "一只狗")
  14. st.image( "https://static.streamlit.io/examples/dog.jpg", width= 200)
  15. with tab3:
  16. st.header( "一只猫头鹰")
  17. st.image( "https://static.streamlit.io/examples/owl.jpg", width= 200)
  18. with tab4:
  19. col1, col2, col3, col4 = st.columns( 4)
  20. col1.header( "col1")
  21. col2.header( "col2")
  22. col3.header( "col3")
  23. col4.header( "col4")
  24. with tab5:
  25. tab5.subheader( "一个带有图表的选项卡")
  26. tab5.line_chart(data)
  27. with tab6:
  28. tab6.subheader( "一个带有数据的选项卡")
  29. tab6.write(data)
  30. def main():
  31. if runtime.exists():
  32. # layout_sidebar()
  33. layout_tab()
  34. else:
  35. sys.argv = [ "streamlit", "run", sys.argv[ 0]]
  36. sys.exit(stcli.main())
  37. if __name__ == '__main__':
  38. main()

条件渲染的注意事项:需要注意的是,每个选项卡的所有内容都会被一次性发送并渲染在前端,目前不支持条件渲染。这意味着无论用户是否查看某个选项卡,所有内容都会被加载和渲染。在设计应用时,请确保选项卡内的内容在逻辑上是相关的,避免出现不必要的数据传输和渲染。

容器:st.expander 展开/折叠

当内容相对较多时。Streamlit 提供了 st.expander 组件,可以在应用程序中插入一个可展开或折叠的容器,用来承载多个元素。用户可以点击展开或折叠容器,以便在需要时查看更多内容,同时保持界面的整洁性。

通过调用 st.expander,您可以插入一个可展开或折叠的容器,用于包含多个元素。容器的初始状态是折叠的,只显示提供的标签。用户可以点击标签来展开容器,查看其中的内容。同样,您可以选择使用“with”语法或者直接在容器对象上调用方法来添加元素。需要注意的是,目前不支持将 st.expander 嵌套在另一个 st.expander 内。


 
 
  1. import streamlit as st
  2. st.bar_chart({ "data": [ 1, 5, 2, 6, 2, 1]})
  3. with st.expander( "查看说明"):
  4. st.write( """
  5. 上面的图表展示了我为您选择的一些数字。
  6. 这些数字是通过真实的骰子摇出来的,所以它们*保证*是随机的。
  7. """)
  8. st.image( "https://static.streamlit.io/examples/dice.jpg")

也可以直接在容器对象上调用方法:


 
 
  1. import streamlit as st
  2. st.bar_chart({ "data": [ 1, 5, 2, 6, 2, 1]})
  3. expander = st.expander( "查看说明")
  4. expander.write( """
  5. 上面的图表展示了我为您选择的一些数字。
  6. 这些数字是通过真实的骰子摇出来的,所以它们*保证*是随机的。
  7. """)
  8. expander.image( "https://static.streamlit.io/examples/dice.jpg")

目前不支持将 st.expander 嵌套在另一个 st.expander 内。如果需要多层次的展开/折叠功能,您可以使用其他布局组件进行组合。

容器:st.container 插入多元素

通过调用 st.container,您可以插入一个不可见的容器,用于承载多个元素。与之前一样,您可以选择使用“with”语法或者直接在容器对象上调用方法来添加元素。需要注意的是,容器内的内容对用户来说是不可见的,但可以对元素进行管理和组织。


 
 
  1. import streamlit as st
  2. import numpy as np
  3. with st.container():
  4. st.write( "这是容器内的内容")
  5. # 您可以调用任何 Streamlit 命令,包括自定义组件:
  6. st.bar_chart(np.random.randn( 50, 3))
  7. st.write( "这是容器外的内容")

无序插入元素:


 
 
  1. import streamlit as st
  2. container = st.container(border= True)
  3. container.write( "This is inside the container")
  4. st.write( "This is outside the container")
  5. # Now insert some more in the container
  6. container.write( "This is inside too")

容器:st.empty 插入单元素

在开发应用程序时,有时您可能需要动态地插入、替换或清除单个元素,以实现更灵活的内容展示。Streamlit 提供了 st.empty 组件,可以插入一个单元素容器,用于承载一个元素。这使您可以在任何时候动态地操作单个元素,实现更多样化的界面效果。

通过调用 st.empty,您可以插入一个单元素容器,用于承载一个元素。与之前一样,您可以选择使用“with”语法或者直接在容器对象上调用方法来添加、替换或清除元素。


 
 
  1. import streamlit as st
  2. import time
  3. with st.empty():
  4. for seconds in range( 60):
  5. st.write( f"⏳ 已过去 {seconds} 秒")
  6. time.sleep( 1)
  7. st.write( "✔️ 1 分钟结束!")

替换多个元素,然后清除它们:


 
 
  1. import time
  2. import streamlit as st
  3. placeholder = st.empty()
  4. # Replace the placeholder with some text:
  5. placeholder.text( "Hello")
  6. # Replace the text with a chart:
  7. placeholder.line_chart({ "data": [ 1, 5, 2, 6]})
  8. time.sleep( 5)
  9. # Replace the chart with several elements:
  10. with placeholder.container():
  11. st.write( "This is one element")
  12. st.write( "This is another")
  13. # Clear all those elements:
  14. placeholder.empty()

流程 控制

Streamlit 是自上而下逐步渲染出来的,若你的应用场景需要对渲染做一些控制,streamlit 也有提供对应的方法

  • st.stop:可以让 Streamlit 应用停止而不向下执行,如:验证码通过后,再向下运行展示后续内容。
  • st.form:表单,Streamlit 在某个组件有交互后就会重新执行页面程序,而有时候需要等一组组件都完成交互后再刷新(如:登录填用户名和密码),这时候就需要将这些组件添加到 form 中
  • st.form_submit_button:在 form 中使用,提交表单。

缓存特性提升速度

当用户在页面上做一些操作的时候,比如输入数据,都会触发整个 streamlit 应用代码的重新执行,如果其中有读取外部数据的步骤(数 GB 的数据),那这种性能损耗是非常可怕的。

但 streamlit 提供了一个缓存装饰器,当要重新执行代码渲染页面的时候,就会先去缓存里查一下,如果代码或者数据没有发生变化,就直接调用缓存的结果即可。

使用方法也简单,在需要缓存的函数加上 @st.cache 装饰器即可。


 
 
  1. DATE_COLUMN = 'date/time'
  2. DATA_URL = ( 'https://s3-us-west-2.amazonaws.com/'
  3. 'streamlit-demo-data/uber-raw-data-sep14.csv.gz')
  4. @st.cache
  5. def load_data( nrows):
  6. data = pd.read_csv(DATA_URL, nrows=nrows)
  7. lowercase = lambda x: str(x).lower()
  8. data.rename(lowercase, axis= 'columns', inplace= True)
  9. data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN])
  10. return data

部署并web访问

在本地编写的 streamlit 应用,运行起来后只能在本地访问。如果需要让别人也能访问这个应用,那你需要有一台服务器,这样才能通过公网ip进行访问

Streamlit 基础

Streamlit 主要概念
  1. 开发流程
  2. 数据流
  3. 显示和设置数据样式
  4. 使用 magic
  5. 写入 数据帧
  6. 绘制 图表和地图
  7. 绘制 折线图
  8. 绘制 地图
  9. Widgets 组件/控件
  10. 使用 复选框 显示/隐藏数据
  11. 使用 选择框
  12. 布局
  13. 显示 进度
  14. 设置 主题

Streamlit 高级概念
  1. Caching 缓存
  2. Session State 会话状态
  3. What is a session? 什么是会话
  4. Examples of using Session State 使用会话状态的示例
  5. Connections 连接

Streamlit 其他功能
  1. Theming 主题
  2. Pages 页面
  3. Static file serving 静态文件服务
  4. App testing 应用测试

高级功能
  1. Advanced features 高级功能
  2. ⋮ App menu ⋮应用程序菜单
  3. Command-line options 命令行选项
  4. Streamlit configuration Streamlit 配置
  5. Theming 主题
  6. Caching 缓存
  7. Add statefulness to apps为应用添加状态
  8. Pre-release features 预发布功能
  9. Secrets management 机密管理
  10. Working with timezones 使用时区
  11. Advanced notes on widget behavior有关小部件行为的高级说明

官网 教程

创建应用
  1. Create your first app创建你的第一个应用
  2. Fetch some data 获取一些数据
  3. Effortless caching 轻松缓存
  4. How's it work? 它是如何工作的?
  5. Inspect the raw data检查原始数据
  6. Draw a histogram 绘制直方图
  7. Plot data on a map在地图上绘制数据
  8. Filter results with a slider使用滑块筛选结果
  9. Use a button to toggle data使用按钮切换数据
  10. Let's put it all together让我们把它们放在一起
  11. Share your app 共享应用
  12. Get help 获取帮助
创建多页应用
  1. Motivation 赋予动机
  2. Convert an existing app into a multipage app将现有应用转换为多页应用
  3. Create the entrypoint file创建入口点文件
  4. Create multiple pages 创建多个页面
  5. Run the multipage app运行多页应用
  6. Next steps 后续步骤

知识库

使用 Streamlit

官网 30 天学 Streamlit

https://30days.streamlit.app/?challenge=Day1

4、低代码 Python Web 框架

官网文档:https://pywebio.readthedocs.io/zh-cn/latest/

PyWebIO提供了一系列命令式的交互函数来在浏览器上获取用户输入和进行输出,将浏览器变成了一个“富文本终端”,可以用于构建简单的Web应用或基于浏览器的GUI应用。 使用PyWebIO,开发者能像编写终端脚本一样(基于input和print进行交互)来编写应用,无需具备HTML和JS的相关知识; PyWebIO还可以方便地整合进现有的Web服务。非常适合快速构建对UI要求不高的应用。

特性

  • 使用同步而不是基于回调的方式获取输入,代码编写逻辑更自然
  • 非声明式布局,布局方式简单高效
  • 代码侵入性小,旧脚本代码仅需修改输入输出逻辑便可改造为Web服务
  • 支持整合到现有的Web服务,目前支持与Flask、Django、Tornado、aiohttp、 FastAPI(Starlette)框架集成
  • 同时支持基于线程的执行模型和基于协程的执行模型
  • 支持结合第三方库实现数据可视化

安装:pip3 install -U pywebio

使用手册

ePage是新一代的可视化1:1网页及App设计利器,与主流的VS以及eclipse是一个层面的开发工具。ePage在兼具高效的研发生产速度的同时还保证了开放性,方便将传统的JS代码移植到新的系统中。 ◆ 网页开发环境真正做到了1:1的所见即所得,目前主流的开发平台eclipse,vs,dreamweaver等都无法做到这一点。 ◆ 对代码和页面的树状统筹管理,可是轻松的实现2000+页面的超大型项目设计开发和维护。 ◆ “事务集”概念的提出,在网页设计领域首次利用JS统一了前后端代码,同时对事务集进行统筹管理,应付前后台代码衔接轻松自如。 ◆ 兼容各种型号手机及浏览器统一解决方案,从可视化开发环境到部署发布一键完成 ◆ 前后台代码统一集成化设计,前后台代码全部统一采用JavascriptV8,开发者无需使用多种编程语言进行前后台设计 ◆ 高度集成化的同时提供了开放可扩展的开发环境,代码继承性和可维护性极强 ◆ 开发神速,极大的降低了企业开发App以及互联网应用的投入 ◆ 高稳定性,即使入门级水平的程序员也可以写出高质量高稳定性的应用系统 ePage是通用页面设计工具领域的一次重大革新,比传统设计平台开发效率提高10倍以上,同时页面质量和稳定性维护性也得到了极大提高。 本下载包为绿色免费版,展开即可运行,内含: 1. ePage集成开发环境 2. eEngine网页服务器系统,包含32位及64位版本 3. 范例及美术资源 4. 一个完整的小型电商系统源代码 5. 皮肤资源 6. 日志查看器软件 7. 用户使用指南,编程参考手册等文档 ePage应用领域:网页设计,网页开发,后台设计,App设计,网站开发,网站设计,网页开发工具,可视化网页开发工具,页面设计开发工具 0.41版本更新日志 2017年8月10日: ePage:增加代码提示器的显示宽度和滚动条,完善了代码提示器js代码的帮助内容 2017年8月10日: ePage:代码自动完成功能,自动填写代码后光标不能驻留在第一个括号出现的位置 2017年8月10日: ePage:代码编辑器增加(){}[]代码部分的自动标记功能,方便程序员匹配括号 2017年8月9日: 版本升至V0.41 2017年8月9日: ePage:代码编辑器滚动过程中强制显示光标 2017年8月9日: ePage:代码提示在注释区域和字符串区域内不显示 2017年8月9日: ePage:代码编辑器backspace按键增加自动缩进功能 2017年8月9日: ePage:代码编辑器对于tab的处理,改为屏幕4格的栅格对位模式 2017年8月8日: ePage:代码编辑器增加Ctrl+Home跳到代码头部,Ctrl+End跳到代码尾部功能 2017年8月8日: ePage:修改了代码提示器显示在屏幕下方超界问题。优化了代码提示器右侧提示窗口的格式。 2017年8月8日: ePage:增加代码首字母的代码提示功能,并增强了代码自动完成的代码复杂度 2017年8月8日: ePage:优化了代码编辑器右侧垂直滚动条拖动动画 2017年8月7日: ePage:全面优化的代码编辑器的滚动效果 2017年8月7日: ePage:代码标记位置的背景颜色改浅了一些 2017年8月7日: ePage:集成界面增加3个快捷图标;全文标记当前光标位置处字符串功能增加全字匹配以及无搜索结果不标记功能。 2017年8月6日: ePage:代码编辑器增加功能:全文标记当前光标处的文字 2017年8月6日: ePage:增加ctrl+/智能代码注释和删除注释功能 2017年8月5日: ePage:ctrl+/代码注释功能 2017年8月4日: ePage:初步完成单页代码的搜索和替换功能 2017年8月2日: ePage:完成replace all功能 2017年8月2日: ePage:搜索增加全字匹配功能 2017年7月30日: ePage: codeInsight功能在前方有汉字的情况下工作不正常 2017年7月27日: eEngine:layout.heavy属性在出现浮点数的情况下系统处理异常 2017年7月27日: ePage,eEngine:增加ee.getQueryString函数 2017年7月25日: eEngine: 增加把note字段内容写入网页控件的.panel属性中 2017年7月21日: ePage:优化了代码编辑器的效率,界面更流畅 2017年7月20日: eEngine:bug某些情况下跨域访问会被禁止 2017年7月14日: ePage:增加代码签名 2017年7月13日: ePage:codeInsight功能改造完成,版本升级为V0.39 2017年7月12日: ePage:codeIns
声明:本人自己研发 现在免费使用 有需要帮助请登陆网站:www.moduleframework.com.cn Visual Web Developer(可视化Web开发工具) 可视化Web开发工具由Visual Web Developer开发环境, WebFramework运行环境 2大部分组成, Visual Web Developer是基于Windows的一个开发工具,提供了一系列控件, 让您的模块实现只需要通过拖沓控件,指定控件的属性,事件,完全让B/S开发工作 和VB,DELPHI这样的开发工具一样,简单方便,开发出来的界面完全和C/S操作一样,如窗口化的操作, 桌面程序的界面风格等。 WebFramework是基于J2EE技术的一个运行环境,主要负责解释Visual Web Developer开发出来的程序并运行。 开发工具的运行环境(WebFramework): Visual Web Developer开发出来的程序,最终要经过WebFramework解释运行。 WebFramework内置Log4j,Hibernate,DWR,cache等开源技术。 并且实现常用部分功能,如用户登录注册,用户角色与权限,系统模块管理,资源管理,文件上传与下载等。 可以跨操作系统,跨数据库(您不再需要关心数据库的厂商是采用什么了) 支持多种浏览器显示运行结果。如IE,FireFox,Opera,Maxthon,Netcape等。 开发流程: 开发工具主界面: 主界面上半部分由菜单,基本工具栏,控件工具栏(有文本框,Label,下拉框,复选框,按钮,树等控件) 中间是窗口设计,右边由控件列表和属性,事件组成(可编写代码,代码中可以直接调用Java中编写的类)。 图片:http://www.moduleframework.com.cn/images/vwd-main-full.jpg http://www.moduleframework.com.cn/images/webfk-main.jpg 点击放大 运行效果图: Visual Web Developer设计出来的程序,通过WebFramework解释运行后的效果图。 效果图中由2个窗口组成,当点击登录窗口中的注册时,弹出注册对话框,并且弹出是采用模式对话框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值