nicegui,一个非常好用的 Python 库!
itomcoil 2025-08-05 18:53 5 浏览
大家好,今天为大家分享一个非常好用的 Python 库 - nicegui。
Github地址:https://github.com/zauberzeug/nicegui
nicegui是一个Python库,为开发者提供了一种极其简便的方式来构建现代化Web用户界面。与传统Web开发不同,使用NiceGUI无需编写HTML、CSS或JavaScript代码,开发者只需使用熟悉的Python语法即可创建响应式、美观的Web应用。NiceGUI基于FastAPI和Socket.IO构建,具备高性能和实时通信能力,同时保持极简的API设计理念。=
安装
1、基本安装方法
NiceGUI可以通过Python的包管理器pip轻松安装:
pip install nicegui
对于希望使用最新功能的开发者,可以从GitHub安装:
pip install git+https://github.com/zauberzeug/nicegui.git
2、验证安装
安装完成后,可以通过导入库并启动一个简单的应用来验证安装是否成功:
from nicegui import ui
ui.label('Hello, NiceGUI!')
ui.run()
如果成功运行,浏览器将会打开并显示"Hello, NiceGUI!"文本。
特性
- 纯Python开发:无需HTML、CSS或JavaScript知识
- 实时响应:基于Socket.IO的实时通信
- 高性能:基于FastAPI构建,性能出色
- 丰富的组件:预置大量UI组件,从基础控件到复杂图表
- 响应式设计:自动适应不同屏幕大小
- 易于集成:可与现有Flask、FastAPI应用集成
- 语义化版本控制:稳定的API,遵循SemVer规范
- 灵活部署:支持本地开发和云端部署
- 完善的文档:详尽的官方文档和示例
基本功能
1、创建基础UI元素
NiceGUI提供了丰富的基础UI元素,包括按钮、标签、输入框等。以下示例展示如何创建一个简单的表单,这些基础元素是构建复杂界面的基础,适用于创建各类交互式应用。
from nicegui import ui
def show_message():
ui.notify(f'Hello, {name.value}!')
with ui.card().classes('w-80'):
ui.label('User Registration').classes('text-xl font-bold')
name = ui.input('Name')
email = ui.input('Email').props('type=email')
password = ui.input('Password').props('type=password')
ui.button('Register', on_click=show_message)
ui.run(port=8081, favicon=False)
运行结果:
2、响应式布局
NiceGUI支持响应式布局,使应用能够自适应不同屏幕尺寸。以下示例展示如何使用行和列创建适应性布局,这对于开发跨设备应用非常重要,可确保在手机、平板和桌面设备上都有良好的用户体验。
from nicegui import ui
with ui.row():
with ui.card().classes('w-1/3'):
ui.label('Card 1')
ui.button('Click me!')
with ui.card().classes('w-1/3'):
ui.label('Card 2')
ui.switch('Toggle me')
with ui.card().classes('w-1/3'):
ui.label('Card 3')
ui.checkbox('Check me')
ui.run(port=8081, favicon=False)
运行结果:
3、事件处理
事件处理是交互式应用的核心,NiceGUI提供了简洁的方式来注册和响应用户操作。以下示例展示如何创建一个简单的计数器应用,展示了事件处理的基本用法,适用于需要对用户输入作出响应的各类应用。
from nicegui import ui
counter = 0
def increment():
global counter
counter += 1
label.set_text(f'Count: {counter}')
def reset():
global counter
counter = 0
label.set_text(f'Count: {counter}')
label = ui.label(f'Count: {counter}')
with ui.row():
ui.button('Increment', on_click=increment)
ui.button('Reset', on_click=reset).props('outline')
ui.run(port=8081, favicon=False)
运行结果:
高级功能
1、数据可视化
NiceGUI集成了多种数据可视化组件,使创建交互式图表变得简单。以下示例展示如何创建折线图和饼图,这对于数据分析和监控应用尤为重要,可直观展示数据趋势和分布。
from nicegui import ui
import numpy as np
# 创建折线图
with ui.card().classes('w-full'):
x = np.linspace(0, 10, 100)
y = np.sin(x)
ui.echart({
'title': {'text': '正弦函数'},
'xAxis': {'type': 'value'},
'yAxis': {'type': 'value'},
'series': [{'type': 'line', 'data': list(zip(x, y))}]
}).classes('h-40')
# 创建饼图
with ui.card().classes('w-full'):
labels = ['A', 'B', 'C', 'D']
values = [15, 30, 25, 30]
ui.echart({
'title': {'text': '饼图示例'},
'series': [{
'type': 'pie',
'data': [{'name': l, 'value': v} for l, v in zip(labels, values)]
}]
}).classes('h-40')
ui.run(port=8081, favicon=False)
运行结果:
2、页面路由
NiceGUI支持页面路由,使开发多页面应用变得简单。以下示例展示如何创建具有不同页面的应用,这对于构建复杂的Web应用至关重要,允许开发者组织内容并提供清晰的导航结构。
from nicegui import ui
@ui.page('/')
def home():
ui.label('Home Page').classes('text-2xl font-bold')
ui.label('Welcome to my NiceGUI application')
ui.link('Go to About', '/about')
@ui.page('/about')
def about():
ui.label('About Page').classes('text-2xl font-bold')
ui.label('This is a simple multi-page app built with NiceGUI')
ui.link('Go to Home', '/')
ui.run(port=8081, favicon=False)
运行结果:
3、文件上传和下载
NiceGUI简化了文件上传和下载操作,使处理用户文件变得直观。以下示例展示如何创建文件上传组件并处理上传的文件,这对于需要文件交互的应用非常实用,如文档管理系统或数据分析工具。
from nicegui import ui
import pandas as pd
import io
def handle_upload(e):
try:
if not e.name.lower().endswith('.csv'):
ui.notify('Please upload a CSV file', color='negative')
return
content = e.content.read()
df = pd.read_csv(io.BytesIO(content))
ui.notify(f'Successfully loaded CSV with {len(df)} rows')
# 显示数据预览
with results_container:
ui.html('<h3>Data Preview:</h3>')
ui.html(df.head().to_html())
except Exception as ex:
ui.notify(f'Error: {str(ex)}', color='negative')
ui.upload(on_upload=handle_upload, label='Upload CSV file', multiple=False) # 移除了 accept 参数
results_container = ui.element('div')
ui.run(port=8081, favicon=False)
运行结果:
实际应用场景
实时物联网监控面板
以下是使用NiceGUI创建物联网设备监控面板的示例。这种应用场景常见于工业自动化、智能家居和远程设备管理,通过NiceGUI可以快速开发直观的监控界面。
from nicegui import ui
import random
import asyncio
import numpy as np # 添加numpy导入
# 模拟传感器数据
temperature = 21.0
humidity = 45.0
# 创建UI元素
with ui.card().classes('w-full max-w-3xl mx-auto'):
ui.label('IoT Device Dashboard').classes('text-2xl font-bold')
with ui.row():
with ui.card().classes('w-1/2'):
ui.label('Temperature').classes('text-lg')
temp_label = ui.label(f'{temperature}°C').classes('text-2xl')
temp_plot = ui.line_plot(n=50).classes('h-40') # 修改为使用n参数
with ui.card().classes('w-1/2'):
ui.label('Humidity').classes('text-lg')
humid_label = ui.label(f'{humidity}%').classes('text-2xl')
humid_plot = ui.line_plot(n=50).classes('h-40') # 修改为使用n参数
with ui.row():
status = ui.label('Status: Connected').classes('text-green-500')
ui.button('Refresh', on_click=lambda: ui.notify('Refreshed!'))
# 模拟数据更新
temp_data = []
humid_data = []
time_points = []
current_time = 0
async def update_sensors():
global temperature, humidity, current_time
while True:
# 模拟数据变化
temperature += random.uniform(-0.5, 0.5)
humidity += random.uniform(-1, 1)
# 更新UI
temp_label.set_text(f'{temperature:.1f}°C')
humid_label.set_text(f'{humidity:.1f}%')
# 更新图表
current_time += 1
time_points.append(current_time)
temp_data.append(temperature)
humid_data.append(humidity)
# 保持图表数据点数量为50
if len(time_points) > 50:
time_points.pop(0)
temp_data.pop(0)
humid_data.pop(0)
temp_plot.push(np.array(time_points), np.array(temp_data)) # 使用push方法更新数据
humid_plot.push(np.array(time_points), np.array(humid_data)) # 使用push方法更新数据
await asyncio.sleep(1)
ui.timer(1.0, lambda: asyncio.create_task(update_sensors()), once=True)
ui.run(port=8081, favicon=False)
运行结果:
总结
Python NiceGUI库是一个突破性的框架,它简化了Web用户界面的开发过程,使Python开发者无需前端开发经验即可创建美观、响应式的Web应用。通过纯Python代码构建界面的方式消除了传统Web开发的复杂性,同时保持了现代Web应用的功能和外观。NiceGUI适用于广泛的应用场景,从简单的控制面板到复杂的数据可视化工具,都能快速高效地实现。
相关推荐
- selenium(WEB自动化工具)
-
定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...
- 开发利器丨如何使用ELK设计微服务中的日志收集方案?
-
【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...
- 高并发系统设计:应对每秒数万QPS的架构策略
-
当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...
- 2025 年每个 JavaScript 开发者都应该了解的功能
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...
- JavaScript Array 对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战
-
刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...
- 动力节点最新JavaScript教程(高级篇),深入学习JavaScript
-
JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...
- 一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code
-
当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...
- 「晚安·好梦」努力只能及格,拼命才能优秀
-
欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...
- JavaScript 中 some 与 every 方法的区别是什么?
-
大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...
- 10个高效的Python爬虫框架,你用过几个?
-
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...
- 12个高效的Python爬虫框架,你用过几个?
-
实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...
- pip3 install pyspider报错问题解决
-
运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...
- PySpider框架的使用
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 「机器学习」神经网络的激活函数、并通过python实现激活函数
-
神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)