Dearpygui 学习
主窗口相关函数变化
from dearpygui.dearpygui import *
#主窗口设定,title设定主窗口标题,设定宽度和高度
if __name__ == '__main__':
setup_viewport()
set_viewport_title(title="YourTitle")
set_viewport_height(805)
set_viewport_width(1280)
start_dearpygui()
在上一篇的学习中,我们可以看到在主窗口相关的设定函数中,有了许多的变更,其中最主要的变化就是将主窗口设定通过setup viewportl方法进行。
文件选择器窗口变化
在较早的版本中,是通过open_file_dialog 来打开文件选择器窗口
open_file_dialog(callback=apply_selected_file, extensions=".*,.py")
但是在新版本中,则变更为
add_file_dialog(lable="test", directory_selector=False, default_filename='', default_path='/home', id='file', filec_count=10)
add_file_extension("label="test1", parent='file', extension='.*)
需要通过额外设定extensio来设定需要展示的文件类型,在其中我们可以看到parent这个参数,便是非常重要的,前一篇已经讲过每个控件的ID,通过ID可以直接进行控件的值的设定,相关参数的变更,以及子属性,子控件的约束。
子窗口的设定和部分参数
with window(label="Test1", width=600, height=650, no_collapse=True, pos=[0,0], no_resize=True,id=1, no_move=True):
add_text("This is a test:")
建议给每一个添加的控件添加一个ID。在子窗口的设定中,我们设定了他的布局起始位置pos = [0, 0],我们设定了他的高度和宽度,并且设定其不可通过鼠标拖动改变窗口大小。通过POS这个参数的设定,我们可以在主窗口中任意布置子窗口的位置,有点类似于tkinter的线性布局。
plot 绘制
plot作为dearpygui 中最为重要的一个功能,他提供了超多的绘图形式,在plot的绘图机数据处理,显示,以及刷新方面上个人感觉比matlabplotlib 要好用不少。唯一的缺点就是这个plot绘制的图形永远无法保存(目前官方是这样说的),在某些3D plot的渲染场景下也有着不小的优势。在这里建议通过官方的指导文档进行学习
https://dearpygui.readthedocs.io/en/stable_08/api-reference/plots.html
在这里,我便只展示自己用到的最基础的plot
由于我本人是做SSD测试的,因此也使用SSD的一个plot项目来进行说明。在SSD测试中有着三个比较重要的性能指标(BW,IOPS,LAT)
首先我们需要有一个窗口显示plot
with window(label="Plog", width=680, height=650, no_resize=True, no_collapse=True, pos=[602, 0], id=3, no_move=True):
with plot(label="BW", height=200, id=4, parent=3, width=650):
add_plot_legend(label="BWPlot")
add_plot_axis(mvXAxis, label='times', id="times")
add_plot_axis(mvYAxis, label='Read_BW',id="ReadBW")
# set_axis_limits_auto("ReadBW")
set_axis_limits_auto("times")
add_line_series(x=readbw, y=count, label="ReadBW", parent=last_item(), id="readbw")
add_plot_axis(mvYAxis, label='Write_BW', id="WriteBW")
# set_axis_limits_auto("WriteBW")
add_line_series(x=writebw, y=count, label="WriteBW", parent=last_item(), id="writebw")
with plot(label="IOPS", height=200, id=5, parent=3, width=650):
add_plot_legend(label="IOPSPlot")
add_plot_axis(mvXAxis, label='times', id="times1")
add_plot_axis(mvYAxis, label='Read_IOPS', id="ReadIops")
# set_axis_limits_auto("ReadIops")
set_axis_limits_auto("times1")
add_line_series(x=readbw, y=count, label="ReadIops", parent=last_item(), id="readiops")
add_plot_axis(mvYAxis, label='Write_IOPS',id="WriteIops")
# set_axis_limits_auto("WriteIops")
add_line_series(x=writebw, y=count, label="WriteIops", parent=last_item(), id="writeiops")
with plot(label="LAT", height=200, id=6, parent=3, width=650):
add_plot_legend(label="LatPlog")
add_plot_axis(mvXAxis, label='times', id="times2")
add_plot_axis(mvYAxis, label='Read_lat', id="Readlat")
set_axis_limits_auto("times2")
set_axis_limits_auto("Readlat")
add_line_series(x=readbw, y=count, label="ReadLat", parent=last_item(), id="readlat")
add_plot_axis(mvYAxis, label='Write_lat', id="Writelat")
set_axis_limits_auto("Writelat")
add_line_series(x=writebw, y=count, label="WriteLat", parent=last_item(), id="writelat")
在一个窗口中,我放置了三个plot ,用来分别显示BW,IOPS,LAT的实时数据曲线
效果图如下
在功能实现过程中,如果想要数据实时显示,则需要有一个单独的线程,实时对plot 中的line数据进行赋值,如果想要显示的数据不那么拥挤,则需要判断显示的数据点有多少个,超过一定数量则进行抛出。方法也很简单,只需要简单的判断一下X轴的数据点个数。这些都需要在单独的线程中实时进行
def bwplot():
cosdatax = []
cosdatay = []
cosdataz = []
for itemx in count :
cosdatax.append(itemx)
for itemy in readbw :
cosdatay.append(itemy)
for itemz in writebw :
cosdataz.append(itemz)
set_value("readbw",[cosdatax,cosdatay])
set_value("writebw",[cosdatax,cosdataz])
以BW为例,通过set_value 来实时设定ID为 readbw的这一条line的数据,从而达到实时刷新的效果。当前由于此脚本测试需求时长仅在10min以内的小BS,或者BSSPLIT测试,因此并未做数据溢出后出栈的部分。