首页 > Python资料 博客日记
【Python】PyWebIO 初体验:用 Python 写网页
2024-09-07 23:00:05Python资料围观80次
这篇文章介绍了【Python】PyWebIO 初体验:用 Python 写网页,分享给大家做个参考,收藏Python资料网收获更多编程知识
前言
前两天正在逛 Github,偶然看到一个很有意思的项目:PyWebIo。
这是一个 Python 第三方库,可以只用 Python 语言写出一个网页,而且支持 Flask,Django,Tornado 等 web 框架。
甚至,它可以支持数据可视化图表的绘制,还提供了一行函数渲染 Markdown 文本。
那么话不多说,正片开始——
1 使用方法
1.1 安装 Pywebio
打开 CMD,在里面输入以下代码:
pip install pywebio
如果速度太慢,建议使用国内镜像:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pywebio
1.2 输出内容
put_text()
输出文字put_table()
输出表格put_markdown()
输出 markdown 内容put_file()
输出文件下载链接put_image()
输出图片put_button()
输出按钮
请看示例程序:
from pywebio.output import *
def main():
# 文本输出
put_text("Hello world!")
# 表格输出
put_table([
['商品', '价格'],
['苹果', '5.5'],
['香蕉', '7'],
])
# Markdown输出
put_markdown('~~删除线~~')
# 文件输出
put_file('hello_word.txt', b'hello word!')
if __name__ == '__main__':
main()
1.3 输入内容
input()
和 python 一样的函数欸
from pywebio.input import *
def main():
name = input("请输入你的名字:")
if __name__ == '__main__':
main()
2 示例程序
这些都是官方给出的实例,代码都不到 100 行!
2.1 BMI 计算器
from pywebio.input import input, FLOAT
from pywebio.output import put_text
def bmi():
height = input("Your Height(cm):", type=FLOAT)
weight = input("Your Weight(kg):", type=FLOAT)
BMI = weight / (height / 100) ** 2
top_status = [(14.9, 'Severely underweight'), (18.4, 'Underweight'),
(22.9, 'Normal'), (27.5, 'Overweight'),
(40.0, 'Moderately obese'), (float('inf'), 'Severely obese')]
for top, status in top_status:
if BMI <= top:
put_text('Your BMI: %.1f, category: %s' % (BMI, status))
break
if __name__ == '__main__':
bmi()
2.2 Markdown 编辑器
from pywebio import start_server
from pywebio.output import *
from pywebio.pin import *
from pywebio.session import set_env, download
def main():
"""Markdown Previewer"""
set_env(output_animation=False)
put_markdown("""# Markdown Live Preview
The online markdown editor with live preview. The source code of this application is [here](https://github.com/wang0618/PyWebIO/blob/dev/demos/markdown_previewer.py).
## Write your Markdown
""")
put_textarea('md_text', rows=18, code={'mode': 'markdown'})
put_buttons(['Download content'], lambda _: download('saved.md', pin.md_text.encode('utf8')), small=True)
put_markdown('## Preview')
while True:
change_detail = pin_wait_change('md_text')
with use_scope('md', clear=True):
put_markdown(change_detail['value'], sanitize=False)
if __name__ == '__main__':
start_server(main, port=8080, debug=True)
2.3 聊天室
import asyncio
from pywebio import start_server
from pywebio.input import *
from pywebio.output import *
from pywebio.session import defer_call, info as session_info, run_async
MAX_MESSAGES_CNT = 10 ** 4
chat_msgs = [] # The chat message history. The item is (name, message content)
online_users = set()
def t(eng, chinese):
"""return English or Chinese text according to the user's browser language"""
return chinese if 'zh' in session_info.user_language else eng
async def refresh_msg(my_name):
"""send new message to current session"""
global chat_msgs
last_idx = len(chat_msgs)
while True:
await asyncio.sleep(0.5)
for m in chat_msgs[last_idx:]:
if m[0] != my_name: # only refresh message that not sent by current user
put_markdown('`%s`: %s' % m, sanitize=True, scope='msg-box')
# remove expired message
if len(chat_msgs) > MAX_MESSAGES_CNT:
chat_msgs = chat_msgs[len(chat_msgs) // 2:]
last_idx = len(chat_msgs)
async def main():
"""PyWebIO chat room
You can chat with everyone currently online.
"""
global chat_msgs
put_markdown(t("## PyWebIO chat room\nWelcome to the chat room, you can chat with all the people currently online. You can open this page in multiple tabs of your browser to simulate a multi-user environment. This application uses less than 90 lines of code, the source code is [here](https://github.com/wang0618/PyWebIO/blob/dev/demos/chat_room.py)", "## PyWebIO聊天室\n欢迎来到聊天室,你可以和当前所有在线的人聊天。你可以在浏览器的多个标签页中打开本页面来测试聊天效果。本应用使用不到90行代码实现,源代码[链接](https://github.com/wang0618/PyWebIO/blob/dev/demos/chat_room.py)"))
put_scrollable(put_scope('msg-box'), height=300, keep_bottom=True)
nickname = await input(t("Your nickname", "请输入你的昵称"), required=True, validate=lambda n: t('This name is already been used', '昵称已被使用') if n in online_users or n == '📢' else None)
online_users.add(nickname)
chat_msgs.append(('📢', '`%s` joins the room. %s users currently online' % (nickname, len(online_users))))
put_markdown('`📢`: `%s` join the room. %s users currently online' % (nickname, len(online_users)), sanitize=True, scope='msg-box')
@defer_call
def on_close():
online_users.remove(nickname)
chat_msgs.append(('📢', '`%s` leaves the room. %s users currently online' % (nickname, len(online_users))))
refresh_task = run_async(refresh_msg(nickname))
while True:
data = await input_group(t('Send message', '发送消息'), [
input(name='msg', help_text=t('Message content supports inline Markdown syntax', '消息内容支持行内Markdown语法')),
actions(name='cmd', buttons=[t('Send', '发送'), t('Multiline Input', '多行输入'), {'label': t('Exit', '退出'), 'type': 'cancel'}])
], validate=lambda d: ('msg', 'Message content cannot be empty') if d['cmd'] == t('Send', '发送') and not d['msg'] else None)
if data is None:
break
if data['cmd'] == t('Multiline Input', '多行输入'):
data['msg'] = '\n' + await textarea('Message content', help_text=t('Message content supports Markdown syntax', '消息内容支持Markdown语法'))
put_markdown('`%s`: %s' % (nickname, data['msg']), sanitize=True, scope='msg-box')
chat_msgs.append((nickname, data['msg']))
refresh_task.close()
toast("You have left the chat room")
if __name__ == '__main__':
start_server(main, debug=True)
2.4 五子棋
import time
from pywebio import session, start_server
from pywebio.output import *
goboard_size = 15
# -1 -> none, 0 -> black, 1 -> white
goboard = [
[-1] * goboard_size
for _ in range(goboard_size)
]
def winner(): # return winner piece, return None if no winner
for x in range(2, goboard_size - 2):
for y in range(2, goboard_size - 2):
# check if (x,y) is the win center
if goboard[x][y] != -1 and any([
all(goboard[x][y] == goboard[m][n] for m, n in [(x - 2, y), (x - 1, y), (x + 1, y), (x + 2, y)]),
all(goboard[x][y] == goboard[m][n] for m, n in [(x, y - 2), (x, y - 1), (x, y + 1), (x, y + 2)]),
all(goboard[x][y] == goboard[m][n] for m, n in [(x - 2, y - 2), (x - 1, y - 1), (x + 1, y + 1), (x + 2, y + 2)]),
all(goboard[x][y] == goboard[m][n] for m, n in [(x - 2, y + 2), (x - 1, y + 1), (x + 1, y - 1), (x + 2, y - 2)]),
]):
return ['⚫', '⚪'][goboard[x][y]]
session_id = 0 # auto incremented id for each session
current_turn = 0 # 0 for black, 1 for white
player_count = [0, 0] # count of player for two roles
def main():
"""Online Shared Gomoku Game
A web based Gomoku (AKA GoBang, Five in a Row) game made with PyWebIO under 100 lines of Python code."""
global session_id, current_turn, goboard
if winner(): # The current game is over, reset game
goboard = [[-1] * goboard_size for _ in range(goboard_size)]
current_turn = 0
my_turn = session_id % 2
my_chess = ['⚫', '⚪'][my_turn]
session_id += 1
player_count[my_turn] += 1
@session.defer_call
def player_exit():
player_count[my_turn] -= 1
session.set_env(output_animation=False)
put_html("""<style> table th, table td { padding: 0px !important;} button {padding: .75rem!important; margin:0!important} </style>""") # Custom styles to make the board more beautiful
put_markdown(f"""# Online Shared Gomoku Game
All online players are assigned to two groups (black and white) and share this game. You can open this page in multiple tabs of your browser to simulate multiple users. This application uses less than 100 lines of code, the source code is [here](https://github.com/wang0618/PyWebIO/blob/dev/demos/gomoku_game.py)
Currently online player: {player_count[0]} for ⚫, {player_count[1]} for ⚪. Your role is {my_chess}.
""")
def set_stone(pos):
global current_turn
if current_turn != my_turn:
toast("It's not your turn!!", color='error')
return
x, y = pos
goboard[x][y] = my_turn
current_turn = (current_turn + 1) % 2
@use_scope('goboard', clear=True)
def show_goboard():
table = [
[
put_buttons([dict(label=' ', value=(x, y), color='light')], onclick=set_stone) if cell == -1 else [' ⚫', ' ⚪'][cell]
for y, cell in enumerate(row)
]
for x, row in enumerate(goboard)
]
put_table(table)
show_goboard()
while not winner():
with use_scope('msg', clear=True):
current_turn_copy = current_turn
if current_turn_copy == my_turn:
put_text("It's your turn!")
else:
put_row([put_text("Your opponent's turn, waiting... "), put_loading().style('width:1.5em; height:1.5em')], size='auto 1fr')
while current_turn == current_turn_copy and not session.get_current_session().closed(): # wait for next move
time.sleep(0.2)
show_goboard()
with use_scope('msg', clear=True):
put_text('Game over. The winner is %s!\nRefresh page to start a new round.' % winner())
if __name__ == '__main__':
start_server(main, debug=True, port=8080)
稍微试了试这个第三方库,感觉功能十分的强大。
不只是上面的项目,它还有不同风格,能绘制不同图表,集成web框架。
有了这个库,我们就可以轻松地将 Python 程序展示在网页上,也就是实现使用 Python 开发前端!
本文就到这里,如果喜欢的话别望点赞收藏!拜~
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 光流法结合深度学习神经网络的原理及应用(完整代码都有Python opencv)
- Python 图像处理进阶:特征提取与图像分类
- 大数据可视化分析-基于python的电影数据分析及可视化系统_9532dr50
- 【Python】入门(运算、输出、数据类型)
- 【Python】第一弹---解锁编程新世界:深入理解计算机基础与Python入门指南
- 华为OD机试E卷 --第k个排列 --24年OD统一考试(Java & JS & Python & C & C++)
- Python已安装包在import时报错未找到的解决方法
- 【Python】自动化神器PyAutoGUI —告别手动操作,一键模拟鼠标键盘,玩转微信及各种软件自动化
- Pycharm连接SQL Sever(详细教程)
- Python编程练习题及解析(49题)
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程