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()
效果如下: