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
英文地址,請注明出處:http://en.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…