一款好看的Python下的GUI庫:dearpygui

說明

之前寫測試上位機都是用PyQT,可以拖拽控件實現所見即所得的設計效果。但是編譯後的EXE體積較大、響應較慢,經常卡死,而且界面想要設計好看點需要了解其他界面設計知識。
後面看到了 dearpygui 庫,感覺實現的界面很現代。它運行很流暢,效果也很棒。

dearpygui

入門資源

以下是可以參考的入門資源:

簡單的與pyqt對比

簡單的使用了一下,就操作體驗與pyqt進行簡單對比。
在pyqt中想要實現一個用於顯示溫度的圖表,需要使用pyqtgraph並進行綁定。實際上體驗也還可以。不過由於pyqt的特性,對於自由拖拽放大縮小界面,實現起來比較麻煩。而且對於多組數據進行同一界面的多座標系展示,有些不好實現。
而dearpygui對於座標曲線的實現則很簡潔且好用。
比如之前寫的溫度探頭上位機和編寫的測試顯示程序UI對比:
image
pyqt上我沒研究明白如何添加兩個不同座標系的數據到同一個界面中,所以當時顯示的兩個溫度值差距很大時,就分離的很遠,不方便查看,而dearpygui中則很簡單的就建立了兩個縱座標,共用一個橫座標。

對於全局操作,它也很方便,就是每個控件都能用tag參數來指定自己的代號,然後在其他地方操作同一個控件。但是沒有pyqt那種很明顯的從屬關係的操作方式。pyqt中對某個控件的操作是: 所屬界面.所屬button.目標操作,比如

main_ui.label_MainUI_InforShow.setText(self.InforShowString) #對 main_ui 界面的 名稱爲label_MainUI_InforShow的label 進行 setText 操作

另外,dearpygui的使用要注意開啓上下文。目前看來,整個界面的運行需要限定在上下文之間,所以對於程序的實現邏輯需要做一點注意。

dearpygui支持一個函數調用自定義編輯主題的操作,對於主題或是樣式的調試非常方便。
目前還沒有使用過更進一步的多界面切換等內容,暫不做評測。
當然,它最大的不方便就是沒辦法實現pyqt那種能用qtcreat軟件來實現所見即所得的拖拽界面,所有的控件都需要自己指定位置,不指定位置的話,它會自動排列。想要達到想要的界面排列效果,可能需要一定的耐心,不斷的運行驗證。但是pyqt的所見即所得也需要耐心的調試

以下是上面的溫度獲取的測試程序(寫的比較隨意,用於驗證):

# -*- coding: utf-8 -*-
"""
Created on Wed May 24 18:09:11 2023

@author: ZNZZ
"""
import dearpygui.dearpygui as dpg
import random
import time
import math
import threading

dpg.create_context()
start_time = time.time()
sindatax = []
sindatay = []
sindatay1 = []
#sindatax.append(0)
#sindatay.append(0)

count = 0
state = 1

def buttoncallback():
    print("TimerStart")
    print("開始模擬溫度數據")
    Timer.start()
def get_temperature():   
    return random.uniform(0, 100)

def plot_temperature():
    global count
    global state
    sindatax.append(count)
    count = count+1
    sindatay.append(get_temperature())
    sindatay1.append(get_temperature())
    #dpg.add_line_series(sindatax, sindatay, label="Temp", parent="y_axis")
    dpg.set_value('templine1', [sindatax, sindatay])
    dpg.set_value('templine2', [sindatax, sindatay1])
    if state == 1:
        if count>30:
            dpg.set_axis_limits('x_axis', count-30, count)
        else:
            dpg.set_axis_limits('x_axis', 0, count)
    else:
        dpg.set_axis_limits_auto('x_axis')
    print(time.time() - start_time)
    Timer = threading.Timer(1,plot_temperature)
    Timer.start()
def stateChange():
    global state
    if state == 0:
        state = 1
        print("鎖定曲線")
    else:
        state=0
        print("釋放曲線")
with dpg.window(tag="Primary Window",label="Tutorial",height=-1,width=-1):
    dpg.add_button(label="Start Timer", tag="R1",callback = buttoncallback)
    dpg.add_button(label="Lock ", tag="Button_2",callback = stateChange)
    with dpg.plot(label="Line Series", height=-1,width=-1):
       # optionally create legend
       dpg.add_plot_legend()
       # REQUIRED: create x and y axes
       dpg.add_plot_axis(dpg.mvXAxis, label="x",tag="x_axis")

       dpg.add_plot_axis(dpg.mvYAxis, label="Temp1")
       dpg.add_line_series(sindatax, sindatay, label="Temp1 lines", parent=dpg.last_item(),tag="templine1")

        # create y axis 2
       dpg.add_plot_axis(dpg.mvYAxis, label="Temp2")
       dpg.add_stem_series(sindatax, sindatay, label="Temp2 stem", parent=dpg.last_item(),tag="templine2")

Timer = threading.Timer(1,plot_temperature)
dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.set_primary_window("Primary Window", True)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

可以看到,很少的代碼和邏輯就能實現PYQT需要很多代碼才能實現的界面,還很好看。

官方demo

官方提供了幾個例子,可以用如下的程序查看:

import dearpygui.dearpygui as dpg
# 導入demo
import dearpygui.demo as demo

dpg.create_context()
dpg.create_viewport(title="DearPyGui_test", width=700, height=700)

#自行切換查看不同的demo,很多功能可以去源碼中查看具體的實現方式。
# 顯示demo1
demo.show_demo()
# 顯示demo2
#dpg.show_imgui_demo()
# 顯示demo3
#dpg.show_implot_demo()

dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

總結

pyqt與dearpygui各有優缺點,可以根據需要進行選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章