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 實時渲染,所以沒有很多內置的本地組件,但組件豐富度并不少,又庫本身較小,對于打包比較友好。