一款好看的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各有优缺点,可以根据需要进行选择。

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