2022年 11月 5日

用Python写前端

分享一个让开发交互式 Web app 超级简单的工具。不会 HTML,CSS,JAVASCRIPT 也没事。交互式 Web app 非常实用,比如说做一个问卷调查页面、一个投票系统、一个信息收集表单,上传文件等等,因为网页是可视化的,因此还可以作为一个没有服务端的图片界面应用程序而使用。

如果你有这样的开发需求,那用 Python 真的是太简单了。

借助于 PyWebIO(pip install pywebio),你可以分分钟实现网页的信息录入,可以看下面的动图:

 上面的页面,也就仅仅用了这 6 行代码:

  1. from pywebio.input import *
  2. input("This is a simple text input")
  3. select("This is a drop down menu", ['Option1', 'Option2'])
  4. checkbox("Multiple Choices!", options=["a",'b','c','d'])
  5. radio("Select any one", options=['1', '2', '3'])
  6. textarea('Text Area', rows=3, placeholder='Multiple line text input')

要让网页输出想要的信息也是非常简单,代码如下,函数功能已经做了相关注释,你很容易看懂:

  1. from pywebio.output import *
  2. from pywebio import session
  3. # 网页上显示纯文本
  4. put_text("Hello friend!")
  5. # 网页上显示表格
  6. put_table([
  7. ['Object', 'Unit'],
  8. ['A', '55'],
  9. ['B', '73'],
  10. ])
  11. # 网页上显示 MarkDown
  12. put_markdown('~~PyWebIO~~')
  13. # 网页上显示下载文件的链接
  14. put_file('output_file.txt', b'You can put anything here')
  15. # 网页上显示图片
  16. put_image(open('python_logo.png', 'rb').read())
  17. # 网页上显示弹窗
  18. popup('popup title', 'popup text content')
  19. # 保持回话是打开状态,否则页面显示完毕程序退出
  20. session.hold()

                                                       

                          构建基于浏览器的 GUI 程序

PyWebIO 提供了一系列命令式的交互函数来在浏览器上获取用户输入和进行输出,将浏览器变成了一个“富文本终端”,可以用于构建简单的 Web 应用或基于浏览器的 GUI 应用。

比如计算 BMI 指数的脚本:

  1. from pywebio import start_server
  2. from pywebio.input import input, FLOAT
  3. from pywebio.output import put_text
  4. def bmi():
  5. height = input("请输入你的身高(cm):", type=FLOAT)
  6. weight = input("请输入你的体重(kg):", type=FLOAT)
  7. BMI = weight / (height / 100) ** 2
  8. top_status = [(14.9, '极瘦'), (18.4, '偏瘦'),
  9. (22.9, '正常'), (27.5, '过重'),
  10. (40.0, '肥胖'), (float('inf'), '非常肥胖')]
  11. for top, status in top_status:
  12. if BMI <= top:
  13. put_text('你的 BMI 值: %.1f,身体状态:%s' % (BMI, status))
  14. break
  15. if __name__ == '__main__':
  16. start_server(bmi, port=80)

效果:

 

更多示例:

基本 demo

  • 聊天室[1]: 和当前所有在线的人聊天 (不到 90 行代码实现)

  • Markdown 实时预览[2]: 可以实时预览的在线 Markdown 编辑器 (不到 40 行代码实现)

  • 在线五子棋游戏[3]: 多人协作对战的五子棋游戏 (不到 100 行代码实现)

  • 输入演示[4]: 演示 PyWebIO 输入模块的用法

  • 输出演示[5]: 演示 PyWebIO 输出模块的用法

数据可视化 demo

PyWebIO 还支持使用第三方库进行数据可视化

  • 使用 bokeh 进行数据可视化[6]

  • 使用 plotly 进行数据可视化[7]

  • 使用 pyecharts 创建基于 Echarts 的图表[8]

  • 使用 pyg2plot 创建基于 G2Plot 的图表[9]

  • 使用 cutecharts.py 创建卡通风格图表[10]

                                                与现有框架集成

PyWebIO 还可以方便地整合进现有的 Web 服务,让你不需要编写 HTML 和 JS 代码,就可以构建出具有良好可用性的应用。目前支持与 Flask、Django、Tornado、aiohttp、FastAPI 框架集成。

比如说与 Tornado 应用整合:

  1. import tornado.ioloop
  2. import tornado.web
  3. from pywebio.platform.tornado import webio_handler
  4. class MainHandler(tornado.web.RequestHandler):
  5. def get(self):
  6. self.write("Hello, world")
  7. if __name__ == "__main__":
  8. application = tornado.web.Application([
  9. (r"/", MainHandler),
  10. (r"/bmi", webio_handler(bmi)), # bmi 即为上文计算BMI指数的函数
  11. ])
  12. application.listen(port=80, address='localhost')
  13. tornado.ioloop.IOLoop.current().start()

与 Django 整合:

  1. from django.urls import path
  2. from pywebio.platform.django import webio_view
  3. # `task_func` is PyWebIO task function
  4. webio_view_func = webio_view(task_func)
  5. urlpatterns = [
  6. path(r"tool", webio_view_func),
  7. ]

与更多框架的整合见文档[11]

最后

PyWebIO 使用同步而不是基于回调的方式获取输入,代码编写逻辑更自然,非声明式布局,布局方式简单高效,代码侵入性小,旧脚本代码仅需修改输入输出逻辑便可改造为 Web 服务,还可以整合到现有的主流 Web 框架。同时支持基于线程的执行模型和基于协程的执行模型,支持结合第三方库实现数据可视化,更多知识请阅读官方文档[12]

一句话,PyWebIO 让交互式的 Web 开发变得更加简单,特别适合开发简单的 GUI 程序及数据可视化。

参考资料

[1]        聊天室

[2]        Markdown 实时预览

[3]        在线五子棋游戏

[4]        输入演示

[5]        输出演示

[6]        使用 bokeh 进行数据可视化

[7]        使用 plotly 进行数据可视化

[8]        使用 pyecharts 创建基于 Echarts 的图表

[9]        使用 pyg2plot 创建基于 G2Plot 的图表

[10]       使用 cutecharts.py 创建卡通风格图表

[11]        文档

[12]        官方文档