PyWebIo

2023-11-05

Part1什么是 PyWebIo

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

Part2PyWebIo 的特点

  • 使用同步而不是基于回调的方式获取输入,代码编写逻辑更自然

  • 非声明式布局,布局方式简单高效

  • 代码侵入性小,旧脚本代码仅需修改输入输出逻辑便可改造为 Web 服务

  • 支持整合到现有的 Web 服务,目前支持与 FlaskDjangoTornadoaiohttpFastAPI(Starlette)框架集成

  • 同时支持基于线程的执行模型和基于协程的执行模型

  • 支持结合第三方库实现数据可视化

Part3安装

pip3 install -U pywebio

Part4入门例子

我们用这个例子,来实现对数据的提交和检验。

from pywebio.input import *
from pywebio.output import *
from pywebio.pin import *
from pywebio import start_server

def input_input():
    # input的合法性校验
    # 自定义校验函数

    def check_age(n):
        if n<1:
            return "Too Small!@"
        if n>100:
            return "Too Big!@"
        else:
            pass

    myAge = input('please input your age:',type=NUMBER,validate=check_age,help_text='must in 1,100')
    print('myAge is:',myAge)

if __name__ == '__main__':
    start_server(
        applications=[input_input,],
        debug=True,
        auto_open_webbrowser=True,
        remote_access=True,
        )

效果图

Part5更多用法

1input

# 输入框
input_res = input("please input your name:")
print('browser input is:', input_res)

# 密码框
pwd_res = input("please input your password:",type=PASSWORD)
print('password:', pwd_res)

# 下拉框
select_res = select("please select your city:",['北京','西安','成都'])
print('your city is:',select_res)

# checkbox
checkbox_res = checkbox("please confirm the checkbox:",options=['agree','disagree'])
print('checkbox:', checkbox_res)

# 文本框
text_res = textarea("please input what you want to say:",rows=3,placeholder='...')
print('what you said is:',text_res)

# 文件上传
upload_res = file_upload("please upload what you want to upload:",accept="image/*")

with open(upload_res.get('filename'),mode='wb') as f: # 因为读取的图片内容是二进制,所以要以wb模式打开
    f.write(upload_res.get('content'))
print('what you uploaded is:',upload_res.get('filename'))

# 滑动条

sld = slider('这是滑动条',help_text='请滑动选择')  # 缺点是不能显示当前滑动的值
toast('提交成功')
print(sld)

# 单选选项

radio_res = radio(
    '这是单选',
    options=['西安','北京','成都']
    )
print(radio_res)

# 更新输入项

Country2City={
    'China':['西安','北京','成都'],
    'USA': ['纽约', '芝加哥', '佛罗里达'],
}

countries = list(Country2City.keys())

update_res = input_group(
    "国家和城市联动",
    [
        # 当国家发生变化的时候,onchange触发input_update方法去更新name=city的选项,更新内容为Country2City[c],c代表国家的选项值
        select('国家',options=countries,name='country',onchange=lambda c: input_update('city',options=Country2City[c])),
        select('城市',options=Country2City[countries[0]],name='city')
    ]
)

print(update_res)

输入框
密码框
选择框
勾选框
文本框
文件上传
滑动条
单选框
输入框联动-1
输入框联动-2

2output

# 文本输出
put_text('这是输出的内容')

# 表格输出
put_table(
    tdata=[
        ['序号','名称'],
        [1,'中国'],
        [2,'美国']
    ]
)

# MarkDown输出
put_markdown('~~删除线~~')

# 文件输出
put_file('秘籍.txt','降龙十八掌')

# 按钮输出
put_buttons(
    buttons=['A','B'],
    onclick=toast
)

效果

3部分高级用法

# ========================== 1-输入框的参数 ==============================

# input的更多参数
ipt = input(
    'This is label',
    type=TEXT,
    placeholder='This is placeholder',  # 占位
    help_text='This is help text',  # 提示
    required=True,                  # 必填
    datalist=['a1', 'b2', 'c3'])    # 常驻输入联想
print('what you input is:',ipt)

# =========================== 2-输入框自定义校验 =============================

# input的合法性校验
# 自定义校验函数

def check_age(n):
    if n<1:
        return "Too Small!@"
    if n>100:
        return "Too Big!@"
    else:
        pass

myAge = input('please input your age:',type=NUMBER,validate=check_age,help_text='must in 1,100')
print('myAge is:',myAge)

# ============================ 3-代码编辑 ============================

# textare的代码模式

code = textarea(
    label='这是代码模式',
    code={
        'mode':'python',
        'theme':'darcula',
    },
    value='import time\n\ntime.sleep(2)'
    )
print('code is:',code)

# ============================== 4-输入组 ==========================

def check_age(n):
    if n<1:
        return "Too Small!@"
    if n>100:
        return "Too Big!@"
    else:
        pass

def check_form(datas):
    print(datas)
    if datas.get("age")==1:
        #return 'you are only one years old!'
        return ('age','you are only one years old!')
    if len(datas.get("name"))<=3:
        return ('name','Name Too short!!!')

# 输入组
datas = input_group(
    "It's input groups...",
    inputs=[
        input('please input name',name='name'),
        input('please input age',name='age',type=NUMBER,validate=check_age)
    ],
    validate=check_form
    )

# ====================================== 5-输入框的action =========================================

import time

def set_today(set_value):
    set_value(time.time())
    print(time.time())

tt = input('选择时间',action=('Today',set_today),readonly=True)
print(tt)

# ====================================== 5-输入框的弹窗 =========================================

def set_some(set_value):  # 此方法可以将选择的英文转换为中文
    with popup('It is popup'):    # popup 是 output 模块中的方法
        put_buttons(['Today','Tomorrow'],onclick=[lambda: set_value('今天','Today1'),lambda:set_value('明天','Tomorrow2')])   # set_value('今天','Today') 按Today的按钮输入Today1,实际对应:今天
        put_buttons(['Exit'],onclick=lambda _: close_popup())

pp = input('go popup',type=TEXT,action=('按钮弹窗',set_some))
print(pp)

联想词常驻+help_text
代码编辑模式
输入组
输入框的action
输入框的弹窗
按钮的onclick

代码中的 print 内容会在后台控制台打印出来。

Part6参考

  • https://pywebio.readthedocs.io/zh_CN/latest/

以上就是今天的全部内容了,感谢您的阅读,我们下节再会。

往期推荐

Gevent | 异步就用它!

5分钟带你了解Scrum

5分钟学会本地Pypi源搭建

FastApi-18-Token生成

FastApi-19-Token校验

FastApi-20-Token获取和使用

jenkinsclient | 好用的jenkins客户端

PySimpleGUI经典实践之:这个汉字怎么读?

IO被谁吃了?

Jmeter测试TCP百万连接

点亮在看!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyWebIo 的相关文章

  • 如何在bootstrap中默认隐藏侧边栏?

    我在这里有一个很好的参考 作为 Bootstrap 在设计 Web 表单应用程序时的侧边栏 http startbootstrap com template overviews simple sidebar http startbootst
  • 您可以将现有的 div 复制到模式对话框吗

    我有一个带有多个面板的仪表板来显示不同的信息 我希望能够添加一个按钮来以模式显示面板 我正在使用引导程序 我所能找到的只是已经编写的模态 我想复制作为面板的 div 标签的内容 然后将其显示在模型中 但我不确定如何进行 该面板的 html
  • 在按钮之间添加空间?

    嗨 我这里有一个代码 除了一件事之外 一切都很完美 代码中每个按钮之间没有空格 我尝试过 margin 但不幸的是它是一个无序列表 所以我有点困惑 我将添加或替换什么以在两个按钮之间留出空间 帮助
  • 将输入中每个单词的第一个字符设为大写

    我想知道如何在输入区域自动生成单词的第一个字符 目前我的代码是 Name
  • 如何为 TBODY 应用垂直滚动条

    我的表中有 4 列和 5 行数据 我必须为 TBODY 应用垂直滚动条 TH 标题内容不应滚动 我对场景进行了编码 并且在我将滚动类应用于 TBODY 之前它工作正常 一旦我将滚动样式类应用于 TBODY 它就会破坏之前的对齐方式 任何人都
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • 如何在没有 AM/PM 的情况下使用 datetime-local?

    我想使用以下代码
  • 使用画布仅删除文本而不删除图像

    我正在尝试删除画布元素中的文本 而不丢失Background Image of the Canvas Element 我想我需要保存Imagesrc并把它还给Canvas Element之后clearRect 但我不知道该怎么做 我希望有人
  • JSF 2.1 中的 HTML 4 <按钮>

    我想使用以下命令 The JSF
  • 增加数字输入、CSS、HTML 上的向下和向上箭头的大小

    有没有办法利用CSS来增大数字输入框右侧的上下箭头的大小 只是向上和向下箭头 而不是整个输入框 或者至少是按比例的 看这个例子 size 36 font size 36px size 12 font size 12px
  • 在 HTML5 中创建可拖动和可缩放的网格

    与其他 HTML5 不同如何创建网格问题 我想知道如何制作一个可拖动且可扩展的 绘制网格非常简单 var c document getElementById canvas var ctx c getContext 2d var width
  • 如何通过单击图像预览上的“x”从文件输入中删除图像?

    我目前有一个文件输入 一旦用户上传图像 就会显示图像预览 在图像预览上 有一个 x 可以从列表中删除图像预览 单击此 x 后 有什么方法可以从输入中的文件集中删除图像吗
  • 如何倾斜 div 并保持背景图像不倾斜

    我已经花了几个小时了 所以希望有人能提供帮助 我有一个网站 其中大部分 div 都是倾斜的 大多数 div 都包含背景图像 现在我已经让 div 倾斜了 内容完美地位于其中 唯一的问题是背景图像 它与父级一起倾斜 我用谷歌搜索了很多 但找不
  • HTML5 历史 API

    我如何使用 HTML5 历史 api 我确实经历过https developer mozilla org en DOM Manipulated the browser history https developer mozilla org
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • 如何将此 HTML 表格布局解决方案转换为浮动 div 解决方案?

    我经常需要列出各种尺寸的项目images在左边和text在右边 像这样 替代文本 http www deviantsart com upload 7s01l5 png http www deviantsart com upload 7s01
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r

随机推荐

  • cmake 教程

    https github com Akagi201 learning cmake blob master docs cmake practice pdf
  • 地图大量数据查询与渲染——bug及解决方案

    本文记录大数据可视化项目中信息查询过程遇到的实际问题及解决方案 用到了Vue自定义组件 Promise all DocumentFragment event loop等 项目需求 项目使用的arcgis地图服务中主要地图要素为图斑即面状要素
  • 基于 SpringBoot+vue 的校园二手书平台

    文章目录 1 介绍 2 技术栈 3 需求分析 4系统设计 4 1数据库设计 5系统详细设计 5 1系统功能模块 5 2管理员功能模块 5 3 卖家用户功能模块 6 源码获取 1 介绍 本次设计任务是要设计一个乐校园二手书交易管理系统 通过这
  • chmod修改权限命令

    chmod修改权限命令 在linux系统中 进行命令键入开启文件或文件夹时 常会出现权限不够的报错信息 这里就需要chmod命令来修改权限了 语法为chmod R lt 模式 gt lt 文件或目录 gt 例如 chmod 777 file
  • 蓝云EasyTrack——专业的企业级项目管理工具

    项目管理工作越来越离不开项目管理工具 如果是个人或单个小型团队使用 用来管理任务 可以选择在线的协同工具或轻量项目管理工具 如果是多团队 跨部门项目管理 或者用于企业级的项目管理 那就需要专业的企业级项目管理工具 术业有专攻 在IT 产品研
  • 异常java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Sheet.getDrawingPat原因与解决

    在做excel导出时遇到的异常 java lang NoSuchMethodError org apache poi ss usermodel Sheet getDrawingPat 原因是 jar包不兼容 这是依赖
  • 2023华为od机试C++ 目录与考试说明(B卷+A卷)

    本专栏使用C 语言解题 常见问题 1 进入机考网页之后如果链接上写着 B卷 就表示是B卷题库 对应着目录中的时间这一列 2023Q2 在2023年5月10日之后 大多数同学收到的应该是B卷题库 2 2022年的题库已经废弃 如果时间紧迫 建
  • 程序员自曝接私活:10个月时间接了30多个单子,纯收入40万

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 随着互联网的发展 对于程序员的需求也日益增多 一些程序员在按部就班的同时 也会在外接一些私活增加收入 无独有偶 有一名程序员无意间发现了商机 开始了全职接私活 在10个月时
  • oVirt:数据中心的开源虚拟化

    oVirt 数据中心的开源虚拟化 通过标记 发布 2019年1月30日 更新 2019年2月27日 oVirt是基于Linux Libvirt和KVM的完整的开源虚拟化解决方案 它旨在成为VMware vSphere的替代产品 让我们看看它
  • PyTorch深度学习实践概论笔记8练习-kaggle的Titanic数据集预测(一)数据分析

    刘老师在第8讲PyTorch深度学习实践概论笔记8 加载数据集中留下一个练习 对kaggle上的Titanic数据集 使用DataLoader类进行分类 训练目标是预测某位乘客是否活下来 Survived 本篇文章先读取数据和做一些简单的数
  • QT编译安装QtMqtt子模块,WIN平台

    QT安装QtMqtt子模块 下载源代码编译 添加库文件到QT安装目录 测试工程 最终效果 2021 10 15 补充 将配置文件添加到安装目录 完整文件下载 系统 Windows10 环境 QT5 12 9 下载源代码编译 GitHub上下
  • 【Qt Quick】Android环境配置及第一个Hello World

    Android环境配置及第一个Hello World 安装Java jdk 安装Android studio 安装手机模拟器 配置Qt 第一个Hello World 常见错误 安装Java jdk 1 下载 链接 link Java1 8
  • Java数据库开发之Hibernate框架(4)Hibernate的查询

    占位 下周补充
  • kettle定时调度

    简单版 https blog csdn net hzp666 article details 107841754 详细版 1 场景介绍 根据不同的操作系统定时调度kettle资源库中的job 1 1Windows系统的定时调度 我的是 ve
  • 网络IO模型

    网络IO的本质是对socket的读取 在网络IO的过程中 有两个重要角色 分别是系统内核和用户进程 首先要等系统内核准备好数据 然后将数据从系统内核拷贝至用户进程空间 这样才算完成了一次IO 如果在系统内核没有准备好数据时 用户IO线程在此
  • Gimpel Software推出C和C ++的首选静态分析工具 PC-lint Plus,不再维护PC-lint/FlexeLint。

    Gimpel Software已不再维护PC lint FlexeLint版本9 最终更新是2014年发布的版本9 00L Gimpel Software在2018年底之前为PC lint FlexeLint提供技术支持 Gimpel So
  • Qt头文件中的QT_BEGIN_NAMESPACE

    在源代码中是这样定义的 1 define QT BEGIN NAMESPACE namespace QT NAMESPACE 2 define QT END NAMESPACE 也就是说 如果你定义以下内容 1 QT BEGIN NAMES
  • 数据结构-链式队列

    link queue node h ifndef LINK QUEUE NODE H define LINK QUEUE NODE H include
  • 串口通信协议概述——针对面试

    串口通信 串口通信 Serial Communications 的概念非常简单 串口按位 bit 发送和接收字节的通信方式 重要参数 1 数据位 2 停止位 3 奇偶校验位 4 波特率 其中 数据位 停止位 奇偶校验位又是数据格式 数据格式
  • PyWebIo

    Part1什么是 PyWebIo PyWebIO 提供了一系列命令式的交互函数来在浏览器上获取用户输入和进行输出 将浏览器变成了一个 富文本终端 可以用于构建简单的 Web 应用或基于浏览器的 GUI 应用 使用 PyWebIO 开发者能像