首页 > 编程语言 >一款好看的Python下的GUI库:dearpygui

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

时间:2023-06-01 22:11:31浏览次数:54  
标签:Python demo GUI pyqt label dpg dearpygui axis

说明

之前写测试上位机都是用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各有优缺点,可以根据需要进行选择。

标签:Python,demo,GUI,pyqt,label,dpg,dearpygui,axis
From: https://www.cnblogs.com/zhinianzhizhan/p/17431099.html

相关文章

  • 【python】类的专有方法
    概述号方法,描述&简单的调用1__init__(self[,args...])构造函数简单的调用方法: obj=className(args)2__del__(self)析构方法,删除一个对象简单的调用方法: delobj3__repr__(self)转化为供解释器读取的形式简单的调用方法: repr(obj)4__......
  • 【十七】Python中的反射机制(4)
    【十七】Python中的反射机制(4)【1】什么是反射?反射指在程序运行过程中可以动态获取对象的信息。是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象中操作成员,一种基于字符串的驱动。【2】Python反射中的内置函数(1)getattr......
  • 【二十四】Python中super()详解及应用场景举例(1)
    【二十四】Python中super()详解及应用场景举例(1)【1】作用super也是一个类,是的。他不是一个方法也不是一个内置的关键字。classA:passprint(type(super(A)))#<class'super'>直接通过查看super的源码也可以看出它是一个类classsuper(object):"""......
  • 【二十三】Python 中 property() 函数及 @property 装饰器的使用(1)
    【二十三】Python中property()函数及@property装饰器的使用(1)【1】property应用场景在获取、设置和删除对象属性的时候,需要额外做一些工作。比如在游戏编程中,设置敌人死亡之后需要播放死亡动画。需要限制对象属性的设置和获取。比如用户年龄为只读,或者在设置用户......
  • Python循环语句
    #循环语句#使用while循环打印出0-100的所有数字#循环的初始化条件num=1#当num<100时,会一直执行循环体whilenum<101:  print("num=",num)  #迭代语句  num+=1print("循环结束")print("---------------------------")#使用while遍历字符串str="TheageofM......
  • 【Python】pandas dataframe 插入一行数据
    pandas插入一行数据#需要借助numpy操作importnumpyasnpimportpandasaspdvalue={"a":[1,2,3],"b":[1,2,3],"c":[1,2,3]}df=pd.DataFrame(value)df1=pd.DataFrame(np.insert(df.values,0,values=[0,0,0],axis=0))df1.columns=df......
  • Python multipart/form-data上传图片,包含file和其他参数的复杂情况
    我们先来看看multipart/form-data上传原理,如下图:   如上图,我们的请求头必须包含一个特殊的请求头信息:Content-Type,类型为:multipart/form-data,而且还要有一个内容分割符(boundary)用于分割请求体中的多个post的内容。因为接收方解析和还原文件必须要根据这个boundary......
  • Python multipart/form-data上传图片只有file一个参数的情况
    格式:multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的,与post方法的不同之处:请求头,请求体。multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个......
  • day16 Python下的三元运算符
    Python下的三元运算符【一】引言三元表达式(三目运算符)能够简洁我们的代码三元表达式其实是将if...else...判断语句的简化表达,代替很多ifelse和if-else一样,只有一个表达式会被执行。因此,三元表达式中的if和else可以包含大量的计算,但只有True的分支会被执行在Java、C......
  • python selenium 下拉框处理
    在自动化测试中,处理下拉框(Dropdown)有以下几种方式:1.使用Select类:通过select的相关方法选择option选项select.select_by_index(index)参数index表示的option索引select.select_by_value(value)参数value表示的是option元属中value的属性值select.select_by_visible_te......