Python GUI 框架 -- DearPyGui 简易入门

DearPyGui

关于

DPG 是一个简单且功能强大的 Python 图形用户界面框架。

与其他Python图形用户界面库相比,DPG具有以下独特之处:

  • GPU 渲染
  • 多线程
  • 高度可定制
  • 内置开发人员工具:主题检查、资源检查、运行时指标
  • 带有数百种小部件组合的 70 多个小部件
  • 详细的文档、示例和支持

Dear PyGui文档: https://www.osgeo.cn/dearpygui/index.html

安装与运行

pip install dearpygui

首次运行:

import dearpygui.dearpygui as dpgdpg.create_context()
dpg.create_viewport(title='Custom Title', width=600, height=300)with dpg.window(label="Example Window"):dpg.add_text("Hello, world")dpg.add_button(label="Save")dpg.add_input_text(label="string", default_value="Quick brown fox")dpg.add_slider_float(label="float", default_value=0.273, max_value=1)dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

运行后效果图如下:
图1

演示文档

DPG 有一个完整的内置演示/展示案例。研究一下这个演示可以帮助快速开发。

import dearpygui.dearpygui as dpg
import dearpygui.demo as demodpg.create_context()
dpg.create_viewport(title='Custom Title', width=600, height=600)demo.show_demo()dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

如图:
图2

注意:

主脚本必须始终执行如下代码:

  • 创建上下文:create_context
  • 创建视区:create_viewport
  • 设置 dearpygui:setup_dearpygui
  • 显示该视口中:show_viewport
  • 启动 Dearpygui:start_dearpygui
  • 清理环境:destroy_context

即所有 DPG 应用程序必须做 3 件事:

  • 创建和销毁上下文
  • 创建和显示视区
  • 设置和启动 DearPyGui

主窗口

DPG 可以将一个窗口指定为主窗口。主窗口将填充该视口并始终绘制在其他窗口的后面。

import dearpygui.dearpygui as dpgdpg.create_context()with dpg.window(tag="Primary Window"):dpg.add_text("Hello, world")dpg.add_button(label="Save")dpg.add_input_text(label="string", default_value="Quick brown fox")dpg.add_slider_float(label="float", default_value=0.273, max_value=1)dpg.create_viewport(title='Custom Title', width=600, height=200)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("Primary Window", True)
dpg.start_dearpygui()
dpg.destroy_context()

如图:
图3

Tag

DPG 使用 “add_*” 添加组件,每一个组件都有一个 tag,如不显示设置,则由 DPG 自动生成。tag 可以是整数或字符串,用于唯一指定该组件,一个 DPG 实例中,tag 不可重复。整数 0-10 保留用于 DPG 内部项目。

import dearpygui.dearpygui as dpgdpg.create_context()with dpg.window(label="Tutorial"):b0 = dpg.add_button(label="button 0")b1 = dpg.add_button(tag=100, label="Button 1")dpg.add_button(tag="Btn2", label="Button 2")print(b0)
print(b1)
print(dpg.get_item_label("Btn2"))dpg.create_viewport(title='Custom Title', width=600, height=200)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

如图:
图4

创建容器

下面将向代码中添加一个窗口、一个组和子窗口。可以直接将项添加到上下文管理器,也可以稍后通过指定父项来添加项。

import dearpygui.dearpygui as dpgdpg.create_context()with dpg.window(label="Tutorial"):dpg.add_button(label="Button 1")dpg.add_button(label="Button 2")with dpg.group():dpg.add_button(label="Button 3")dpg.add_button(label="Button 4")with dpg.group() as group1:pass
dpg.add_button(label="Button 6", parent=group1)
dpg.add_button(label="Button 5", parent=group1)dpg.create_viewport(title='Custom Title', width=600, height=400)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

回调

回调通过在激活组件时指定要运行的函数来赋予组件功能,并且 DPG 中的几乎所有 UI 组件都可以运行回调。

可以在创建组件时通过参数 callback 设置回调参数,也可以通过方法 set_item_callback 在创建完组件后分配回调函数。

import dearpygui.dearpygui as dpgdpg.create_context()def button_callback(sender, app_data, user_data):print(f"sender is: {sender}")print(f"app_data is: {app_data}")print(f"user_data is: {user_data}")with dpg.window(label="Tutorial"):# user data and callback set when button is createddpg.add_button(label="Apply", callback=button_callback, user_data="Some Data")# user data and callback set any time after button has been createdbtn = dpg.add_button(label="Apply 2", )dpg.set_item_callback(btn, button_callback)dpg.set_item_user_data(btn, "Some Extra User Data")dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

如图:
图5

回调最多可以有 3 个参数,顺序如下。

sender:提交回调的 UI 组件的 id。
app_data:有时,UI 组件会发送它们自己的数据(例如文件对话框,checkbox 的是否选中)。
user_data:要发送给该函数的任何 Python 对象。

组件默认值

几乎所有 UI 组件都有一个默认值 default_value 可以在添加组件时设置初始值,当然也可以在组件创建完成后再设置这个值,设置后还可以获取这个值。分别使用 set_value 和 get_value。

以下是在创建 input_text 和 slider_float 组件时同时设置默认值 default_value,然后借助回调函数通过 get_value 获取设置的值。

import dearpygui.dearpygui as dpgdpg.create_context()def print_value(sender):""" 获取组件的值 """print(dpg.get_value(sender))with dpg.window(width=300):input_txt1 = dpg.add_input_text()# The value for input_text2 will have a starting value# of "This is a default value!"input_txt2 = dpg.add_input_text(label="InputTxt2",default_value="This is a default value!",callback=print_value)slider_float1 = dpg.add_slider_float()# The slider for slider_float2 will have a starting value# of 50.0.slider_float2 = dpg.add_slider_float(label="SliderFloat2",default_value=50.0,callback=print_value)dpg.set_item_callback(input_txt1, print_value)dpg.set_item_callback(slider_float1, print_value)print(dpg.get_value(input_txt1))print(dpg.get_value(input_txt2))print(dpg.get_value(slider_float1))print(dpg.get_value(slider_float2))dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

也可以在创建完组件 slider_int 后,通过 set_value 设置 default_value,需要 tag 确定是哪个组件。

import dearpygui.dearpygui as dpgdpg.create_context()with dpg.window(width=300):# Creating a slider_int widget and setting the# default value to 15.dpg.add_slider_int(default_value=15, tag="slider_int")# On second thought, we're gonna set the value to 40
# instead - for no reason in particular...
dpg.set_value("slider_int", 40)dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

文件和目录选择器

文件对话框项目可用于选择单个文件、多个文件或目录。

import dearpygui.dearpygui as dpgdpg.create_context()def callback(sender, app_data):print('OK was clicked.')print("Sender: ", sender)print("App Data: ", app_data)def cancel_callback(sender, app_data):print('Cancel was clicked.')print("Sender: ", sender)print("App Data: ", app_data)dpg.add_file_dialog(directory_selector=True, show=False, callback=callback, tag="file_dialog_id",cancel_callback=cancel_callback, width=700 ,height=400)with dpg.window(label="Tutorial", width=800, height=300):dpg.add_button(label="Directory Selector", callback=lambda: dpg.show_item("file_dialog_id"))dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

如图:
图6

有更多配置可用,可以根据文件扩展名设置不同文件的颜色,可以允许创建固定菜单、收藏夹、目录树等。

其他

可以通过 dpg.menu() 和 dpg.add_menu_item() 设置菜单栏,通过 dpg.popup() 设置弹窗,通过 dpg.tooltip() 设置提示。

甚至有绘图功能,draw_line() 绘制线,draw_text() 绘制文本,draw_arrow() 绘制箭头,draw_image() 加载一些图像。通过 add_image() 加载图片。

dpg.table() 和 dpg.add_table_column()、dpg.table_row() 可以创建一些常用的表格。

更多内容

import dearpygui.dearpygui as dpgdpg.create_context()# DPG 包括几个可帮助开发和调试应用程序的工具
dpg.show_documentation()
dpg.show_debug()
dpg.show_about()# 内置的样式编辑器允许您在运行时尝试所有样式选项
dpg.show_style_editor()# 组件注册表以分层结构显示正在运行的应用程序的所有组件
dpg.show_item_registry()# 字体管理器显示所有加载的字体及其合适的大小,允许您检查随每个字体文件加载的所有字符或字形
dpg.show_font_manager()# 运行时指标实时显示应用程序的性能
dpg.show_metrics()dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

如图:
图7
总之,DearPyGUI 是一个还不错的 Python GUI 框架,相较于 PyQt、PySide,虽然历史还不够久,文档可能还不够丰富,应用上还没有很大规模,但是有自己独特的方面,由于是 GPU 实时渲染,所以没有很多内置的本地组件,但组件丰富度并不少,又库本身较小,对于打包比较友好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95972.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gcloud cli 使用 impersonate模拟 服务帐号

什么是模拟服务帐号 众所周知, gcloud 登陆的方式有两种 使用个人帐号, 通常是1个邮箱地址使用一个service account 通常是1个 json key 文件 所谓模式服务帐号意思就是, 让操作人员用个人帐号登陆, 但是登陆后所有的操作都是基于…

idf--esp32的看门狗menuconfig

1.Interrupt Watchdog Timeout (ms):意思是中断看门狗,也就是专门监管中断响应时间的看门狗,如果某个中断服务程序超过了这个运行时间,就会导致程序重启。2.红框是任务看门狗的最大看门时间,超过时间就会警告&#xff…

git在Linux中的使用

git-Linux中的使用一、下载git二、https方式上传三、ssh秘钥方式上传一、下载git 版本信息 [rootrocky ~]# cat /etc/rocky-release Rocky Linux release 9.4 (Blue Onyx) [rootrocky ~]# cat /etc/rocky-release-upstream Derived from Red Hat Enterprise Linux 9.4 [rootro…

HMI(人机界面)

新晋码农一枚,小编定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!一、核心…

嵌入式解谜日志—多路I/O复用

多路 I/O复用(Multiplexed I/O):1.定义:系统提供的I/O事件通知机制2.应用:是一种 I/O 编程模型,用于在单线程中同时处理多个(阻塞) I/O 操作,避免因等待某个 I/O 操作完成…

关于嵌入式学习——单片机4

ds18b20温度传感器的使用一、传感器分类:数字温度传感器,实现简单,不需要额外转换电路,采集过来的就是数字温度值模拟温度传感器->热敏电阻->AD转换电路->数字值二、传感器接口:GPIO接口:&#xf…

Kali搭建sqli-labs靶场

1.输入apt-get install docker.io即可下载靶场镜像。 下载好后,我们输入docker search sqli-labs搜索sqli-labs靶场。2.我们选择第一个,输入docker pull acgpiano/sqli-labs,将该靶场装到本地。此时输入docker images,发现本地有s…

电脑外接显示屏字体和图标过大

当外接显示屏的分辨率过高时,可以调整显示器设置来解决字体和图标过大的问题。具体操作包括在桌面右击选择显示设置,切换到外接显示器,将分辨率调至推荐的1920x1080,或根据个人偏好进行适当调节,然后保存更改。 原因&a…

Linux 网络流量监控 Shell 脚本详解(支持邮件告警)

前言 一、脚本功能 二、实现原理 三、Shell 脚本实现 四、关键知识点解析 1. Bash 关联数组 2. 命令组 { } 与子 Shell ( ) 3. 字符串拼接换行 4. 流量计算逻辑 五、测试方法 六、优化建议 七、总结 前言 在生产环境中,监控服务器的 网络流量 非常重要…

【牛客刷题-剑指Offer】BM18 二维数组中的查找:一题四解,从暴力到最优

文章目录 一、题目介绍 1.1 描述 1.2 示例1 1.3 示例2 1.4 给的部分代码 二、题解 方法一:暴力遍历 方法二:二分查找(逐行) 方法三:Z字形查找(最优解) 方法四:递归分治(拓展思路) 三、总结 心得体会 一、题目介绍 原题链接:https://www.nowcoder.com/practice/abc3…

使用pyspark对上百亿行的hive表生成稀疏向量

背景:一张上百亿行的hive表,只有id和app两列,其中app的去重量是8w多个(原app有上百万枚举值,此处已经用id数量进行过筛选,只留下有一定规模的app),id的去重量大概有八九亿&#xff0…

【设计模式】关于学习《重学Java设计模式》的一些成长笔记

【设计模式】关于学习《重学Java设计模式》的一些成长笔记 没有几个人是一说就会的,掌握一些技能,不仅要用心,而且还需要从温故中知新。 为此,好记性不如烂笔头,我干脆一步一脚印地系统学习一遍设计模式! (关注不迷路哈!!!) 文章目录 【设计模式】关于学习《重学Jav…

【基础-判断】@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。

@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。 解释: @Entry 的核心作用与唯一性:@Entry 装饰器用于明确声明该组件是一个页面的入口组件,即整个页面的“根”和“起点”。当UIAbility实例加载并显示页面时,系统需要明确知道…

医学影像AI应用-实践:使用MONAI实现肺部CT图像分割的原理与实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

如何训练一个简单的Transformer模型(附源码)李宏毅2025大模型-作业4

摘要:一、作业目标:使用只有2层transformer的GPT-2,生成完整宝可梦图像。二、源码&解析:使用提供的Transformer模型(GPT-2)进行训练,FID Score: 96.3425一、作业目标1)目标使用T…

leetcode211.添加与搜索单词-数据结构设计

与208.前缀树的设计是一样的,关键点在于word中存在通配符“.",所以针对该特殊情况,在search时针对这里进行全子节点的深度搜索class WordDictionary {TrieNode root;private class TrieNode {char val;// 当前节点的值,冗余了…

项目中的一些比较实用的自定义控件

本文是记录项目开发中一些相对复杂但都比较实用的控件,这些控件都是基于自定义的方式去实现,如果有需要的朋友,这个可以作为一个参考,同时也做一个自我总结。 (1)子项大小不一致的RecyclerView(…

[iOS] 折叠 cell

目录 前言 1.原理 2.折叠 cell 的点击选中 3.折叠 cell 高度的变化 4.实现效果 5.总结 前言 折叠 cell 是在 3GShare 中写过的一个小控件,这篇博客是一个小小的总结。 1.原理 在这里的核心就是我们可以通过改变按钮的 tag 值来判断我们是否应该展开还是回收…

MySQL的组复制(MGR)高可用集群搭建

一、MySQL 组复制(MGR)核心概念 MySQL Group Replication(简称 MGR)是 MySQL 官方推出的 高可用(HA) 强一致性 解决方案,基于改进的 Paxos 协议实现,核心能力可概括为 3 点&#xf…

使用Shell脚本实现Linux系统资源监控邮件告警

前言 1. 问题背景与需求 2. Bash 脚本监控资源 3. Bash 脚本判断阈值 4. 配置 msmtp 发送邮件 4.1 安装 msmtp 4.2 创建配置文件 /etc/msmtprc 5. 发送邮件 5.1 给别人发邮件 6. 完整示例脚本 7. 测试方法 8. 常见问题解答 9. 总结 前言 在运维过程中&#xff0c…