首页 > 编程语言 >nicegui:Python 图形界面库,简单好用

nicegui:Python 图形界面库,简单好用

时间:2023-09-07 19:45:22浏览次数:47  
标签:Python 图形界面 nicegui item add 待办 ui todos

前言

在现代计算机应用程序开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。然而,GUI 开发往往需要大量的代码和复杂的布局,给开发者带来了一定的挑战。在本篇博文中,将介绍 nicegui,它是一个简单易用的图形用户界面库,提供了一种简化 GUI 开发的方式,使开发者能够更快速地构建吸引人的用户界面。

实现原理

nicegui 基于 Python 编程语言开发,采用了声明式的方式来描述用户界面。它的设计灵感来自于 Web 开发中的 HTML 和 CSS,通过一种类似的结构化语法来描述界面的组件和样式。

nicegui 的核心思想是将用户界面分为多个组件,每个组件具有自己的属性和样式。开发者可以使用 nicegui 提供的组件库,如按钮、文本框、下拉菜单等,通过简单的代码来定义和布局这些组件。同时,nicegui 还支持自定义组件,开发者可以根据自己的需求扩展组件库。

安装

可以使用 pip 安装,具体操作如下

pip install nicegui

示例代码

下面是一个简单的 nicegui 示例代码

from nicegui import ui

上述代码中,首先导入 nicegui 中的 ui 模块,模块中包含了常用的组件

例子中使用了 label 和 button,默认情况下,它们是垂直布局的,启动服务使用 run 方法

执行上述脚本,就可以在浏览器中访问 http://127.0.0.1:8080 看到效果了

点击 BUTTON 按钮,在下方会显示提示信息

下面,再来看一个完整的示例

from dataclasses import dataclass, field
from typing import Callable, List

from nicegui import ui


@dataclass
class TodoItem:
    name: str
    done: bool = False


@dataclass
class ToDoList:
    title: str
    on_change: Callable
    items: List[TodoItem] = field(default_factory=list)

    def add(self, name: str, done: bool = False) -> None:
        self.items.append(TodoItem(name, done))
        self.on_change()

    def remove(self, item: TodoItem) -> None:
        self.items.remove(item)
        self.on_change()


@ui.refreshable
def todo_ui():
    if not todos.items:
        ui.label('List is empty.').classes('mx-auto')
        return
    ui.linear_progress(sum(item.done for item in todos.items) / len(todos.items), show_value=False)
    with ui.row().classes('justify-center w-full'):
        ui.label(f'Completed: {sum(item.done for item in todos.items)}')
        ui.label(f'Remaining: {sum(not item.done for item in todos.items)}')
    for item in todos.items:
        with ui.row().classes('items-center'):
            ui.checkbox(value=item.done, on_change=todo_ui.refresh).bind_value(item, 'done')
            ui.input(value=item.name).classes('flex-grow').bind_value(item, 'name')
            ui.button(on_click=lambda item=item: todos.remove(item), icon='delete').props('flat fab-mini color=grey')


todos = ToDoList('My Weekend', on_change=todo_ui.refresh)
todos.add('Order pizza', done=True)
todos.add('New NiceGUI Release')
todos.add('Clean the house')
todos.add('Call mom')

with ui.card().classes('w-80 items-stretch'):
    ui.label().bind_text_from(todos, 'title').classes('text-semibold text-2xl')
    todo_ui()
    add_input = ui.input('New item').classes('mx-12')
    add_input.on('keydown.enter', lambda: (todos.add(add_input.value), add_input.set_value('')))

ui.run()

这段代码使用 nicegui 创建了一个简单的待办事项列表应用。让我们一步一步地解析它的功能和逻辑

首先,导入了必要的模块和类。dataclasses 模块提供了一个装饰器 dataclass,用于创建简洁而强大的数据类。数据类是一种特殊的类,主要用于存储数据,并且通常只包含属性而没有方法。

接着,定义了两个数据类:TodoItem 和 ToDoList。TodoItem 表示待办事项,具有 name 和 done 两个属性,其中 done 表示待办事项是否已完成。ToDoList 表示待办事项列表,具有 title、on_change 和 items 三个属性,其中 items 是一个 TodoItem 对象的列表。ToDoList 还提供了 add 和 remove 方法,用于添加和移除待办事项。

接下来,定义了一个名为 todo_ui 的界面函数,并使用 @ui.refreshable 装饰器标记为可刷新的界面函数。todo_ui 函数用于渲染待办事项列表的界面。

在 todo_ui 函数中,首先检查待办事项列表是否为空,如果为空,则显示一个标签,内容为 List is empty.,并进行居中显示。然后,使用 ui.linear_progress 创建一个线性进度条,用于显示已完成任务的比例,计算已完成任务的数量并除以总任务数量,然后将该值传递给 ui.linear_progress 函数。接着,使用 ui.row 创建一个行布局容器,并在容器中添加两个标签,分别显示已完成的任务数量和剩余的任务数量。通过遍历待办事项列表中的每个事项,计算已完成任务的数量和剩余任务的数量,并显示在标签中。接下来,使用 ui.row 和 ui.checkbox 创建一个行布局和一个复选框,用于显示和编辑待办事项的完成状态。通过设置 value 参数来绑定复选框的值,并使用 on_change 参数指定当复选框状态发生变化时调用的回调函数。使用 bind_value 方法将复选框的值与待办事项对象的 done 属性进行绑定,以实现动态更新。然后,使用 ui.row 和 ui.input 创建一个行布局和一个输入框,用于显示和编辑待办事项的名称。通过设置输入框的初始值和使用 bind_value 方法将输入框的值与待办事项对象的 name 属性进行绑定。

最后,使用 ui.row 和 ui.button 创建一个行布局和一个删除按钮,用于删除待办事项。通过设置按钮的 on_click 参数来指定点击按钮时调用的回调函数,并使用 lambda 表达式传递待办事项对象作为参数。使用 props 方法设置按钮的样式和图标。

在主程序中,创建了一个 ToDoList 实例 todos,设置了标题为 My Weekend,并指定了当待办事项列表发生变化时刷新界面函数 todo_ui。然后,通过调用 todos.add 方法添加了一些初始的待办事项。接下来,使用 ui.card 创建一个卡片容器,并设置其样式,在卡片容器中,创建一个标签,并使用 bind_text_from 方法将其文本与 todos 实例的 title 属性进行绑定,以实现动态更新。然后,调用 todo_ui 函数以渲染待办事项列表的界面。创建一个输入框 add_input,用于添加新的待办事项,通过监听 add_input 输入框的 keydown.enter 事件,当用户按下回车键时,调用 todos.add 方法将输入框的值作为新的待办事项添加到列表中,并将输入框的值重置为空字符串。

最后,调用 ui.run 启动 nicegui 应用程序的事件循环,显示界面并等待用户交互。

通过这个示例项目,我们可以看到 nicegui 的简洁和易用性,开发者可以快速构建出一个功能完善的应用程序界面。

参考资料

标签:Python,图形界面,nicegui,item,add,待办,ui,todos
From: https://www.cnblogs.com/startisan/p/17685903.html

相关文章

  • 执行python脚本报错:case by sslerror(sslcertVerificationerror(1,ssl:vertificate_ve
    【现象】  使用python编写了一个请求,报错ssl证书过期问题【解决办法】   requests.packages.urllib3.disable_warnings()  r=requests.post(service_url,data=payload,headers=self.headers,verify=False)参考链接:https://www.cnblogs.com/sea-stream/p/14......
  • Python垃圾回收
    Python版本v3.9.17分析代码的过程比较枯燥,可以直接跳转到总结。只能被其他对象引用类型比如:longobject、floatobjectfloatobject以floatobject为例子来分析,先看看结构定义typedefstruct{PyObject_HEADdoubleob_fval;}PyFloatObject;//展开PyObject_HEAD......
  • Python 读取excel表1单元格 生成 表2 的超链接
    fromopenpyxlimportload_workbook#加载现有的工作簿fromopenpyxl.utilsimportget_column_letterwb=load_workbook("C:\\Users\\CMS01\\Desktop\\SCHH621TEG_LDO(PLDO、NLDO、CPLDO)测试需求_20230814.xlsx")#获取Sheet1和Sheet6sheet1=wb['Sheet7�......
  • python3读取ini文件内的字段信息
    在使用golang编码时,遇到ini文件的时候,有时候需要解析相关内容,主要就是一些配置信息,我们可能需要解析出来,简单就是用go-ini第三方库搞掂,在python中,同样我们也可以利用现有库来做解析。在python3中,可以用configParser标准库来解析ini文件,以下是代码示例,很简单,看一遍......
  • Windows下python,psycopg2连接HGDB
    瀚高数据库目录环境文档用途详细信息环境系统平台:N/A版本:4.5文档用途 本文介绍在HGDB使用sm3认证时,python使用psycopg2连接HGDB的方法。详细信息 Python连接HGDB可以使用psycopg2、Django,Django是依赖psycopg2的,底层用的都是libpq,pip安装的psycopg2自带libpq。因此在一般情况下......
  • python爬取网站数据笔记分享
    编码问题因为涉及到中文,所以必然地涉及到了编码的问题,借这个机会算搞清楚。问题要从文字的编码讲起。原本的英文编码只有0~255,刚好是8位1个字节。为了表示各种不同的语言,自然要进行扩充。中文的话有GB系列。可能还听说过Unicode和UTF-8,那么,它们之间是什么关系呢?Unicode是一种编码方......
  • Python的pandas库:数据分析工具
    在Python的数据分析领域,pandas库是一个非常强大的工具。它提供了一种灵活的数据结构,可以帮助我们轻松地处理和分析数据。本文将详细介绍pandas库的主要功能和用法,并通过具体案例进行说明。安装与导入首先,确保已经安装了pandas库。如果尚未安装,可以使用以下命令在Python环境中安装:pi......
  • Python语法(1)
    我们准备开始学习python语法,大概会分为几个上传,但都已经排好序这里我们主要通过和C语言进行比较着学习,方便明白区别和相同语法基础首先我们需要熟悉Python语言中的语法规则:变量常见的数据类型:int整数123float浮点数1.34str字符串'python'bool布尔类型T......
  • Python名称空间和作用域,闭包函数
    Python名称空间和作用域,闭包函数名称的查询顺序名称空间的作用域global和nonlocal关键字的使用函数对象(函数名)函数的嵌套调用函数的嵌套定义闭包函数名称空间定义#什么是名称空间? 名称空间即存放名字与对象映射/绑定关系的地方。 就是存放变量名与变量值关系的地......
  • locust:Python 分布式压力测试(带WebUI)
    Locust介绍它采用纯Python实现,是一个分布式用户负载测试的工具。使用基于Requests库的客户端发起请求,使编写脚本大大简化;在模拟并发方面摒弃进程和线程,完全基于时间驱动,采用协程(gevent)提供的非阻塞IO和coroutine来实现网络层的并发请求。因此单台压力机也能产生数......