說明
之前寫測試上位機都是用PyQT,可以拖拽控件實現所見即所得的設計效果。但是編譯後的EXE體積較大、響應較慢,經常卡死,而且界面想要設計好看點需要了解其他界面設計知識。
後面看到了 dearpygui 庫,感覺實現的界面很現代。它運行很流暢,效果也很棒。
dearpygui
入門資源
以下是可以參考的入門資源:
-
【GIT網址】
-
【部分參考例子網址】
-
【Dear PyGui文檔】
主要參考【Dear PyGui文檔】就可以了,裏面有詳細的說明和豐富的實現例程,都可以運行查看效果。
簡單的與pyqt對比
簡單的使用了一下,就操作體驗與pyqt進行簡單對比。
在pyqt中想要實現一個用於顯示溫度的圖表,需要使用pyqtgraph並進行綁定。實際上體驗也還可以。不過由於pyqt的特性,對於自由拖拽放大縮小界面,實現起來比較麻煩。而且對於多組數據進行同一界面的多座標系展示,有些不好實現。
而dearpygui對於座標曲線的實現則很簡潔且好用。
比如之前寫的溫度探頭上位機和編寫的測試顯示程序UI對比:
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各有優缺點,可以根據需要進行選擇。