说明
之前写测试上位机都是用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各有优缺点,可以根据需要进行选择。
标签:Python,demo,GUI,pyqt,label,dpg,dearpygui,axis From: https://www.cnblogs.com/zhinianzhizhan/p/17431099.html