点击蓝字关注我们

NiceGUI 是一个由德国公司 Zauberzeug GmbH 开发的、基于 Python 的 Web UI 框架。它的核心理念非常简单:用纯 Python 代码写出 Web 界面,界面在浏览器中运行,无需写任何前端代码(HTML/CSS/JS)。
官网描述:"Web-based user interfaces with Python. The nice way."
它与 Streamlit、Gradio、Dash 同属 Python Web UI 赛道,但定位不同:
核心优势:
•🐍 纯 Python,零前端知识门槛•🔄 热重载:改代码 → 保存 → 浏览器自动刷新(开发体验极佳)•🧩 组件丰富:按钮、对话框、Markdown、3D 场景、图表、表格、日历……•🌐 浏览器即 UI:任何有浏览器的设备都能访问•📦 部署方式多样:本地运行、Docker、PyInstaller 打包、conda
| GitHub 仓库 | https://github.com/zauberzeug/nicegui[1] |
| 官方网站 | https://nicegui.io[2] |
| 英文文档 | https://nicegui.io/documentation[3] |
| 中文文档 | https://zhuanlan.zhihu.com/p/661187865[4] |
| PyPI | https://pypi.org/project/nicegui/[5] |
| Docker Hub | https://hub.docker.com/r/zauberzeug/nicegui[6] |
| conda-forge | https://anaconda.org/conda-forge/nicegui[7] |
| Zenodo DOI | |
| 开发公司 | |
| Podcast 深度介绍 |
GitHub 上目前 15.9k+ Stars,活跃维护中(最新版本已到 3.x 系列)。
NiceGUI 的底层技术栈非常扎实,不是玩具:
┌─────────────────────────────────────────────┐│ 浏览器(Chrome/Firefox 等) ││ Vue 3 + Quasar Framework + Tailwind CSS │├─────────────────────────────────────────────┤│ WebSocket 双向通信 │├─────────────────────────────────────────────┤│ FastAPI(Python 后端) ││ uvicorn ASGI 服务器 + NiceGUI 框架 │└─────────────────────────────────────────────┘
•后端优先(Backend-first):所有逻辑在 Python 端执行,前端只负责渲染和事件传递•Vue 3 + Quasar:Quasar 是一个基于 Vue 的 Material Design 组件库,NiceGUI 底层直接用它,所以组件风格统一且美观•Tailwind CSS:支持 Tailwind 类名和 Quasar 属性来自定义样式•WebSocket:UI 事件通过 WebSocket 传到 Python 后端处理,响应再推送回浏览器
# 1. 创建并激活虚拟环境(强烈推荐)python -m venv venv# Windows:venv\Scripts\activate# macOS/Linux:source venv/bin/activate# 2. 安装 NiceGUIpip install nicegui
💡 国内用户如果 PyPI 下载慢,可以用豆瓣镜像:
pip install -i https://pypi.douban.com/simple nicegui
验证安装:
python -c "import nicegui; print(nicegui.__version__)"conda install -c conda-forge nicegui# 拉取官方镜像docker pull zauberzeug/nicegui:latest# 运行(假设你的代码在当前目录的 main.py)docker run -it --restart always \-p 8080:8080 \-v $(pwd):/app \zauberzeug/nicegui:latest
Docker Compose 示例(docker-compose.yml):
version: '3.8'services:nicegui:image: zauberzeug/nicegui:latestrestart: alwaysports:- "80:8080"environment:- PUID=1000 # 改成你的用户ID- PGID=1000 # 改成你的组IDvolumes:- ./:/app/
然后执行:
docker-compose up -d创建 main.py:
from nicegui import uiui.label('Hello NiceGUI!')ui.button('点我', on_click=lambda: ui.notify('按钮被按下了!'))ui.run()
运行:
python main.py效果:
•自动打开浏览器(默认 http://localhost:8080 )•页面显示 "Hello NiceGUI!" 和一个按钮•点击按钮,右上角弹出通知•改代码保存后,浏览器自动刷新,无需手动重启 🔥
ui.label('文本') | ||
ui.button('点击', on_click=fn) | ||
ui.input(label='姓名', on_change=fn) | ||
ui.number(label='数量', value=0) | ||
ui.checkbox('同意协议') | ||
ui.select(['A','B'], label='选择') | ||
ui.slider(min=0, max=100, label='进度') | ||
ui.date(label='日期') | ||
ui.time(label='时间') | ||
ui.color(label='颜色') | ||
ui.switch(label='开关') | ||
ui.radio(['A','B'], label='单选') |
ui.notify() | |
ui.dialog() | |
ui.card() | |
ui.table() | |
ui.aggrid() | |
ui.chart() | |
ui.scene() | |
ui.markdown() | |
ui.image() | |
ui.video() | |
ui.audio() | |
ui.file_upload() | |
ui.download() | |
ui.tabs() | |
ui.splitter() | |
ui.timer() | |
ui.scene() | |
ui.plotly() | |
ui.echarts() | |
ui.leaflet() | |
ui.qr() | |
ui.mermaid() | |
ui.task() | |
ui.notification | |
ui.menu() | |
ui.appbar() |
ui.row() | |
ui.column() | |
ui.grid() | |
ui.splitter() | |
ui.tabs()ui.tab() | |
ui.card() | |
ui.expansion() | |
ui.separator() | |
ui.space() |
from nicegui import ui# 数据存储(实际项目建议用数据库)tasks = []def add_task():task = {'text': task_input.value, 'done': False}tasks.append(task)task_input.value = ''task_list.refresh()def toggle_task(e):tasks[e.index]['done'] = not tasks[e.index]['done']task_list.refresh()def delete_task(e):tasks.pop(e.index)task_list.refresh()# ---- UI 定义 ----ui.label('📋 任务管理看板').classes('text-2xl font-bold')with ui.row():task_input = ui.input(placeholder='输入新任务...')ui.button('添加', on_click=add_task)task_list = ui.aggrid(columns=[{'name': 'text', 'label': '任务', 'field': 'text'},{'name': 'done', 'label': '状态', 'field': 'done'},],rows=len(tasks),row_key='text',).classes('w-full')# 绑定事件task_list.on('cell-click', toggle_task)task_list.on('row-dblclick', delete_task)ui.run(title='任务看板', port=8080)
python main.py# 默认: http://localhost:8080# 指定端口: ui.run(port=3000)# 指定主机: ui.run(host='0.0.0.0') # 局域网可访问
ui.run() 的常用参数:
port | ui.run(port=8080) | |
host | ui.run(host='0.0.0.0') | |
title | ui.run(title='我的应用') | |
favicon | ui.run(favicon='🐍') | |
reload | ui.run(reload=False) | |
native | ui.run(native=True) | |
language | ui.run(language='zh') |
# DockerfileFROM zauberzeug/nicegui:latestWORKDIR /appCOPY . .CMD ["python", "main.py"]
docker build -t my-nicegui-app .docker run -d -p 80:8080 --restart always my-nicegui-app
# 安装 PyInstallerpip install pyinstaller# 打包为单个可执行文件nicegui-pack main.py# 生成的文件在 dist/ 目录下# 双击即可运行,无需 Python 环境
nicegui-pack 参数对照:
--onefile | |
--windowed | |
--native |
打包后的应用可以直接发给没有 Python 的用户使用。
ui.run(ssl_keyfile='key.pem',ssl_certfile='cert.pem')
生产环境建议用 Nginx 反向代理 处理 SSL:
server {listen 443 ssl;server_name app.example.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;location / {proxy_pass http://127.0.0.1:8080;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}}
这是 NiceGUI 最受好评的功能之一:
•保存代码 → 浏览器自动刷新 → 立即看到改动•不需要手动停止再重启•开发效率极高
# 关闭热重载(生产环境建议关闭)ui.run(reload=False)
NiceGUI 用 Python 的 with 语句管理组件层级关系,类似 HTML 嵌套:
with ui.card():ui.label('卡片标题').classes('text-lg font-bold')with ui.row():ui.button('左')ui.button('右')
from nicegui import app@app.page('/')def home():ui.label('首页')@app.page('/about')def about():ui.label('关于我们')ui.run()
也支持 APIRouter 模块化:
from nicegui import approuter = app.include_router(home_router)router = app.include_router(login_router)
@ui.refreshabledef fetch_data():# 这个函数会定期自动刷新return ui.label(f'当前时间: {datetime.now()}')ui.timer(1.0, fetch_data) # 每秒刷新
NiceGUI 3.0 原生支持用户认证:
app.users.enable_registration()app.users.enable_verification()
结论:
•快速 demo → Streamlit / Gradio•企业级应用 → Dash•中等复杂度 + 高颜值 + 需要打包/3D/机器人控制 → NiceGUI 是最佳选择
# 一键启动python -m venv venv && source venv/bin/activate && pip install nicegui -i https://pypi.douban.com/simple && python -c "from nicegui import ui; ui.label('🎉 NiceGUI 运行中!'); ui.button('点我', on_click=lambda: ui.notify('成功!')); ui.run()"
一句话总结:NiceGUI 是目前 Python 生态里,把"开发体验"和"UI 颜值"平衡得最好的 Web UI 框架之一,特别适合不想碰前端但又需要漂亮界面的 Python 开发者。
[1]: https://github.com/zauberzeug/nicegui[2]: https://nicegui.io[3]: https://nicegui.io/documentation[4]: https://zhuanlan.zhihu.com/p/661187865[5]: https://pypi.org/project/nicegui/[6]: https://hub.docker.com/r/zauberzeug/nicegui[7]: https://anaconda.org/conda-forge/nicegui
END
求点赞

求分享

求喜欢


点击上图跳转小程序,访问历史记录
