DearPyGui 教程(五)


(注:由于DearPyGui正处于快速迭代期,功能日兴月易,本文所描述的内容很有可能已经过时,如需了解最新信息,请至源文链接:https://hoffstadt.github.io/DearPyGui/tutorial.html)

本教程旨在演示如何使用DearPyGui的一部分特性,并未覆盖DearPyGui的全部功能,更多复杂功能的示例可以在GitHub上的示例文件夹中看到. 有关特定API的信息建议参考 API Reference.

输入轮询(Input Polling)

在DearPyGui中输入轮询是通过在函数调用所需的轮询命令来完成的。 函数必须设置为windows render 渲染回调,以便在该窗口处于激活状态时轮询。 因为render渲染一帧一帧运行的,如果特定的输入执行了,DearPyGui就可以查询到。
所有轮询如下:

  • get_mouse_drag_delta()
  • get_mouse_pos()
  • is_key_down()
  • is_key_pressed()
  • is_key_released()
  • is_mouse_button_clicked()
  • is_mouse_button_double_clicked()
  • is_mouse_button_down()
  • is_mouse_button_dragging()
  • is_mouse_button_released()
  • set_key_down_callback()
  • set_key_press_callback()
  • set_key_release_callback()
  • set_mouse_click_callback()
  • set_mouse_double_click_callback()
  • set_mouse_down_callback()
  • set_mouse_drag_callback()
  • set_mouse_wheel_callback()
  • set_render_callback()
  • set_resize_callback()

命令的详细信息请查看 API Reference.
你可以组合多个轮询,以实现所需的功能。

from dearpygui.core import *


def main_callback(sender, data):
    set_value("Mouse Position", str(get_mouse_pos()))

    if is_key_down(mvKey_A):
        set_value("A key Down", "True")
    else:
        set_value("A key Down", "False")

    if is_key_pressed(mvKey_A):
        set_value("A key Pressed", "True")
    else:
        set_value("A key Pressed", "False")

    if is_key_released(mvKey_A):
        set_value("A key Released", "True")
    else:
        set_value("A key Released", "False")

    if is_mouse_button_dragging(mvMouseButton_Left, 10):
        set_value("Left Mouse Dragging", "True")
    else:
        set_value("Left Mouse Dragging", "False")

    if is_mouse_button_clicked(mvMouseButton_Left):
        set_value("Left Mouse Clicked", "True")
    else:
        set_value("Left Mouse Clicked", "False")

    if is_mouse_button_double_clicked(mvMouseButton_Left):
        set_value("Left Mouse Double Clicked", "True")
    else:
        set_value("Left Mouse Double Clicked", "False")

    if is_key_down(mvKey_Shift) and is_mouse_button_clicked(mvMouseButton_Left):
        set_value("Shift + Left Mouse Clicked", "True")
    else:
        set_value("Shift + Left Mouse Clicked", "False")


add_label_text("A key Down",  color=[0, 200, 255])
add_label_text("A key Pressed",  color=[0, 200, 255])
add_label_text("A key Released",  color=[0, 200, 255])
add_spacing()
add_label_text("Mouse Position",  color=[0, 200, 255])
add_label_text("Left Mouse Clicked",  color=[0, 200, 255])
add_label_text("Left Mouse Dragging",  color=[0, 200, 255])
add_label_text("Left Mouse Double Clicked",  color=[0, 200, 255])
add_label_text("Shift + Left Mouse Clicked",  color=[0, 200, 255])

set_render_callback(main_callback)

start_dearpygui()

多线程和异步函数

对于需要花费较长时间的计算和回调,可以使用异步函数或在不同线程上运行函数,这只需调用 run_async_function() 就行了。
需要注意的是,使用异步命令运行的函数不能调用任何其他DearPyGui API。

from dearpygui.core import *
from time import sleep


def long_async_callback(data, sender):
    run_async_function(long_callback, None)


def long_callback(sender, data):
    sleep(3)


show_logger()
show_metrics()
add_button("long function", callback=long_callback, tip="this will cause a 3 second freeze")
add_button("long Asynchronous Function", callback=long_async_callback, tip="this will not a freeze")

start_dearpygui()

异步函数不能使用 add_data()get_data() 方法, 如果需要将数据传递给异步函数,必须使用 data 和 return_handler 关键字参数。 任何python对象都可以通过“data”关键字发送到函数中,从而达到异步访问的目的。 此外,任何来自异步函数的返回数据都将通过指定返回回调的“data”访问。

from dearpygui.core import *
from time import sleep

def long_async_preparer(data, sender):
    floaty = get_value("Async Input Data")
    run_async_function(long_callback, floaty, return_handler=long_async_return)

def long_callback(sender, data):
    sleep(3)
    return data * 2

def long_async_return(sender, data):
    log_debug(data)

def long_callback2(sender, data):
    sleep(3)
    log_debug(data * 2)

show_logger()
add_text(
    "input a number and see the logger window for the output of the long callback that would normally freeze the GUI")
add_input_float("Async Input Data", default_value=1.0)
add_button("long Function", callback=long_callback2, callback_data=get_value("Async Input Data"), tip="This is the long callback that will freeze the gui")
add_button("long Asynchronous Function", callback=long_async_preparer, tip="this will not a freeze the GUI")

start_dearpygui()

当异步函数方法被调用时,就会创建一个线程池, 可以对线程池配置线程的数量和超时时间。
我们可以使用 set_thread_count() 设置线程池中的线程数。 此外,我们还可以使用 set_threadpool_high_performance() 告诉线程池根据用户计算机的最大限度设置线程数,需要注意的是如果这么做,在调用异步函数时,CPU会以100%的速度运行。
线程池的超时时间可以使用 set_threadpool_timeout() 设置,在设定的时间过后将销毁线程池,并释放资源。

主题和风格(beta)

这个功能正现在还在beta测试中,并计划重新返工。
主题和小部件样式可以应用于单个小部件或整个应用程序。 可以设置的样式的属性有:

  • font size
  • app color scheme
  • corner roundness
    示例如下:
from dearpygui.core import *


def apply_text_multiplier(sender, data):
    font_multiplier = get_value("Font Size Multiplier")
    set_global_font_scale(font_multiplier)


def apply_theme(sender, data):
    theme = get_value("Themes")
    set_theme(theme)


themes = ["Dark", "Light", "Classic", "Dark 2", "Grey", "Dark Grey", "Cherry", "Purple", "Gold", "Red"]
add_combo("Themes", items=themes, default_value="Dark", callback=apply_theme)

add_slider_float("Font Size Multiplier", default_value=1.0, min_value=0.0, max_value=2.0,
                 callback=apply_text_multiplier)

start_dearpygui()

效果如下:
dark

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值