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()
运行后效果图如下:
演示文档
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()
如图:
注意:
主脚本必须始终执行如下代码:
- 创建上下文: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()
如图:
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()
如图:
创建容器
下面将向代码中添加一个窗口、一个组和子窗口。可以直接将项添加到上下文管理器,也可以稍后通过指定父项来添加项。
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()
如图:
回调最多可以有 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()
如图:
有更多配置可用,可以根据文件扩展名设置不同文件的颜色,可以允许创建固定菜单、收藏夹、目录树等。
其他
可以通过 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()
如图:
总之,DearPyGUI 是一个还不错的 Python GUI 框架,相较于 PyQt、PySide,虽然历史还不够久,文档可能还不够丰富,应用上还没有很大规模,但是有自己独特的方面,由于是 GPU 实时渲染,所以没有很多内置的本地组件,但组件丰富度并不少,又库本身较小,对于打包比较友好。