🚀Python神器NiceGUI:手把手带你从0到精通,写GUI界面从未如此简单!

前言 :昨天晚上加班回家,刚躺下就想着,Python做GUI总得折腾PyQt、Tkinter这些庞然大物,写个简单界面都像是在搬砖。忽然,我想起了 NiceGUI------一个超轻量、超简单、超好用的Python GUI框架!想着很多小伙伴可能还没用过,那必须得给你们整一期深入教程了!🔥


🎉 NiceGUI 是个啥?

NiceGUI 是一个基于 Python + WebGUI 框架 ,它的 界面直接在浏览器里运行 ,但代码写起来像 Tkinter 一样简单。最重要的是,它完全 不需要前端知识,适合咱们这种专注于 Python 的人。

安装起来也超级简单:

bash 复制代码
pip install nicegui

然后,跑一个最简单的例子👇

python 复制代码
from nicegui import ui  

ui.label('Hello, NiceGUI!')  # 显示文本
ui.run()  # 运行服务器

运行后,你的浏览器里就会打开一个页面,显示 "Hello, NiceGUI!",这也太丝滑了吧?!😂


📌 核心功能详解:从入门到进阶

NiceGUI 提供了丰富的 组件和功能 ,花姐带你飞,从 基础到进阶 一步步搞懂它的强大之处!


1️⃣ Text Elements(文本组件)

文本组件是 GUI 里最基础的内容,比如 标题、段落、代码框 等。

👀 示例:不同类型的文本

python 复制代码
from nicegui import ui  

ui.label('普通文本')
ui.markdown('# 这是一级标题\n## 这是二级标题')
ui.html('<b>支持 HTML 代码哦!</b>')

ui.run()

🌟 重点

  • ui.label() 👉 适用于普通文本。
  • ui.markdown() 👉 适用于带格式的文本。
  • ui.html() 👉 可以直接嵌入 HTML 代码。

2️⃣ Controls(控制组件)

UI 交互怎么能少了按钮、输入框、滑块这些小玩意呢?

👀 示例:按钮+输入框

python 复制代码
from nicegui import ui  

def on_click():
    ui.notify('你点击了按钮!🎉')

ui.button('点我!', on_click=on_click)

ui.input(label='请输入点啥', placeholder='开始输入',
         on_change=lambda e: result.set_text('你输入的内容为: ' + e.value),
         validation={'输入的内容太长了': lambda value: len(value) < 20})
result = ui.label()

ui.run()

🌟 重点

  • ui.button('文本', on_click=回调函数) 👉 让按钮拥有点击事件。
  • ui.input('提示文本') 👉 创建输入框,并可以绑定事件。
  • ui.notify('xxx') 👉 创建 通知框,可用于提示用户操作反馈!

😂 有趣的地方

可以用 notify() 来整点整活,比如输入 666 时弹出"老板牛逼!"😂


3️⃣ Audiovisual Elements(音视频组件)

NiceGUI 也支持 播放音频、视频、图片等多媒体内容 ,可以用来做 数据可视化,甚至可以做个 Web 版的音乐播放器!

👀 示例:展示图片+播放音频

python 复制代码
from nicegui import ui  

ui.image('https://picsum.photos/300')  # 显示一张随机图片
ui.audio('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3', autoplay=True)

ui.run()

🌟 重点

  • ui.image('图片路径') 👉 可以加载本地/网络图片。
  • ui.audio('音频路径', autoplay=True) 👉 播放音频,支持自动播放。

😂 细节注意

如果想让音频自动播放,部分浏览器可能需要 用户交互(比如点击一下页面)。


4️⃣ Data Elements(数据展示组件)

有时候我们需要展示数据,比如表格、进度条、统计信息等。

👀 示例:表格+进度条

python 复制代码
from nicegui import ui  

columns = [
    {'name': '姓名1', 'label': '姓名', 'field': 'name', 'required': True, 'align': 'left'},
    {'name': '年龄1', 'label': '年龄', 'field': 'age', 'sortable': True},
]
rows = [
    {'name': '哪吒', 'age': 18},
    {'name': '张飞', 'age': 21},
    {'name': '三太子'},
]
ui.table(columns=columns, rows=rows, row_key='name')

ui.linear_progress(0.5)  # 50% 进度条

ui.run()

🌟 重点

  • ui.table(columns=..., rows=...) 👉 轻松创建数据表格。
  • ui.linear_progress(0.5) 👉 进度条,值在 0~1 之间。

💡 开发者容易忽视的小细节
table 里的 columns 需要 namelabel,否则不会正常显示!


5️⃣ Binding Properties(数据绑定)

NiceGUI 让 前端界面和 Python 代码的数据同步 变得异常简单,不需要手动监听事件 ,只要 绑定属性,前端改了,Python 变量自动更新!

👀 示例:输入框 + 实时同步数据

python 复制代码
from nicegui import ui

data = {'name': '花姐', 'age': 17}

ui.label().bind_text_from(data, 'name', backward=lambda n: f'Name: {n}')
ui.label().bind_text_from(data, 'age', backward=lambda a: f'Age: {a}')

ui.button('年龄变成 18 岁', on_click=lambda: data.update(age=18))

ui.run()

🌟 重点

  • bind_text_from 直接绑定数据,逻辑清晰,无需额外的监听器
  • 如果 data 的值是从数据库、API 或传感器获取的,你不需要不停 刷新 UI,数据变化 = UI 变化,完美!

💡 你可能忽略的细节

globals().update(变量=值) 可以让匿名函数修改外部变量,否则 Lambda 不能直接改外部变量


6️⃣ Page Layout(页面布局)

一个好看的界面离不开 布局 ,NiceGUI 里有 栅格系统、侧边栏、分区容器 这些布局工具。

👀 示例:左右布局 + 侧边栏

python 复制代码
from nicegui import ui  

with ui.row():
    ui.button('左边的按钮')
    ui.button('右边的按钮')

with ui.column():
    ui.label('上面的文字')
    ui.label('下面的文字')

with ui.tabs().classes('w-full') as tabs:
    one = ui.tab('Tab1')
    two = ui.tab('Tab2')
with ui.tab_panels(tabs, value=two).classes('w-full'):
    with ui.tab_panel(one):
        ui.label('我是Tab1')
    with ui.tab_panel(two):
        ui.label('我是Tab2')

ui.run()

🌟 重点

  • ui.row() 👉 水平布局,组件并排放置。
  • ui.column() 👉 垂直布局,组件上下排列。
  • ui.tabs() 👉 Tab标签页,适合用于分类展示信息 。

7️⃣ Styling & Appearance(界面美化)

默认的 NiceGUI 界面已经很清爽,但如果想要 更个性化的设计 ,可以调整 颜色、字体、样式

👀 示例:自定义颜色+暗黑模式

python 复制代码
from nicegui import ui

dark = ui.dark_mode()
ui.label('主题切换:')
ui.button('黑色主题', on_click=dark.enable ,color="green")
ui.button('浅色主题', on_click=dark.disable ,color="red")

ui.run()

🌟 重点

  • color='xxx' 👉 改变组件颜色,如 redblue 等。
  • ui.dark_mode() 👉 一键切换 暗黑模式

💡 细节注意

有些组件不支持 color,但可以用 .style('background-color: xxx') 来手动调整!


8️⃣ Action & Events(用户交互)

NiceGUI 支持各种事件监听 ,如 点击、悬停、拖拽、键盘输入 等。

👀 示例:单击 + 鼠标悬停 + 键盘事件

python 复制代码
from nicegui import ui  

def on_key(e):
    ui.notify(f'你按了 {e.key}')

ui.keyboard(on_key)


with ui.row():
    ui.button('A', on_click=lambda: ui.notify('你点击了按钮 A.'))
    ui.button('B').on('click', lambda: ui.notify('你点击了按钮 B.'))
with ui.row():
    ui.button('C').on('mousemove', lambda: ui.notify('鼠标移动到了 C 按钮上面了'))
    ui.button('D').on('mousemove', lambda: ui.notify('鼠标移动到了 D 按钮上面了'), throttle=0.5)

ui.run()

🌟 重点

  • click 👉 监听单击事件。
  • mousemove 👉 监听鼠标悬停。
  • ui.keyboard(函数) 👉 监听键盘输入事件。

😂 有趣的地方

可以做个"精神测验 ":如果用户按 F,就弹出 你真的有点东西!😂


9️⃣ Pages & Routing(多页面管理)

如果想要 多个页面 ,NiceGUI 也支持 路由功能

👀 示例:创建多个页面

python 复制代码
from nicegui import ui  

@ui.page('/')
def main():
    ui.label('这是主页')
    ui.link('去设置页', '/settings')

@ui.page('/settings')
def settings():
    ui.label('这是设置页')
    ui.link('返回主页', '/')

ui.run()

🌟 重点

  • @ui.page('/路径') 👉 定义不同的页面。
  • ui.link('文本', '路径') 👉 创建页面跳转链接。

💡 细节注意

如果页面刷新后数据丢失,可以用 ui.storage 存储数据!


🔟 Configuration & Deployment(配置与部署)

NiceGUI 内置了 FastAPI 服务器 ,可以很方便地 部署到云端打包成独立应用

👀 示例:修改端口号 + 部署

python 复制代码
from nicegui import ui  

ui.label('Hello, NiceGUI!')
ui.run(host='0.0.0.0', port=8080)  # 指定端口

🌟 重点

  • host='0.0.0.0' 👉 让局域网设备访问。
  • port=8080 👉 指定端口,默认是 8080

💡 部署方式

  • 本地运行 :直接 python app.py
  • 服务器部署 :用 gunicornuvicorn 运行后端。
  • 打包成可执行文件exe: nicegui-pack --onefile --name "myapp" app.py

🎯 结语:NiceGUI 让 Python GUI 开发变得更简单!

写完这篇文章,我不得不感叹 NiceGUI 太香了!

  • 代码极简,比 PyQt、Tkinter 轻松 100 倍!
  • 界面美观,不需要前端基础,直接就是 Web 界面!
  • 功能强大,数据展示、交互控制、音视频播放一应俱全!

如果你也对 GUI 开发感兴趣,那就赶紧试试 NiceGUI 吧!🤩

想学习更多NiceGUI 的内容可登录官网:https://nicegui.io/ 查看

👉 最后,顺手点赞 + 在看,就是对花姐最大的支持!💖

相关推荐
Asort2 分钟前
JavaScript 从零开始(六):控制流语句详解——让代码拥有决策与重复能力
前端·javascript
bobz9652 分钟前
VRRP 简记
后端
冯仙笙8 分钟前
统一支付入口集成六种支付方式
后端
无双_Joney20 分钟前
[更新迭代 - 1] Nestjs 在24年底更新了啥?(功能篇)
前端·后端·nestjs
在云端易逍遥22 分钟前
前端必学的 CSS Grid 布局体系
前端·css
ccnocare23 分钟前
选择文件夹路径
前端
艾小码24 分钟前
还在被超长列表卡到崩溃?3招搞定虚拟滚动,性能直接起飞!
前端·javascript·react.js
闰五月25 分钟前
JavaScript作用域与作用域链详解
前端·面试
数据智能老司机25 分钟前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机26 分钟前
精通 Python 设计模式——测试模式
python·设计模式·架构