控件和窗口回调
每个输入控件都有一个回调,该回调在控件交互时运行,回调用于为控件提供功能实现。回调可以在创建时或在创建后使用 set_item_callback
分配给窗口控件。
在 DearPyGui 中,应用于控件的每个回调方法都必须包含一个 sender
和 data
参数。DearPyGui 使用 sender
参数来通知回调——哪个控件通过发送 name
来触发回调。控件再通过指定 callback_data
参数来发送数据到回调方法的 data
参数。
from dearpygui.core import *
from dearpygui.simple import *
add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')
def button_callback(sender, data):
log_debug(f"Sender is: {sender}")
log_debug(f"Data is: {data}")
show_logger() # 使用logger窗口显示结果
with window("Tutorial"):
add_input_text("输入文本", default_value="Hello DearPyGui!")
add_button("提交", callback=button_callback, callback_data=get_value("输入文本"))
add_button("提交##2", tip="创建控件后设置了回调")
set_item_callback("提交##2", callback=button_callback, callback_data=get_value("输入文本"))
start_dearpygui()
dearpygui_callbackdata.png
每次与控件交互时,都可以使用回调来更新变量的值。
from dearpygui.core import *
from dearpygui.simple import *
add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')
def update_var(sender, data):
my_var = get_value("输入复选框")
log_debug(my_var)
show_logger() # 使用logger窗口显示结果
with window("Tutorial"):
add_checkbox("输入复选框", callback=update_var)
start_dearpygui()
dearpygui_senderdata.png
但是,上面的方法缺乏灵活性,无法实现通用的回调方法,下面是通过使用 sender
参数实现的一种更聪明的方法。
from dearpygui.core import *
from dearpygui.simple import *
add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')
def update_var(sender, data):
my_var = get_value(sender)
log_debug(my_var)
show_logger() # 使用logger窗口显示结果
with window("Tutorial"):
add_checkbox("输入复选框", callback=update_var)
add_input_text("输入文本", callback=update_var)
add_input_int("输入整数", callback=update_var)
start_dearpygui()
dearpygui_senderdatasender.png
窗口以及窗口类型的控件具有特殊的回调,这些回调在特殊的事件(例如窗口大小调整、窗口关闭等)上触发。on_close
将在窗口关闭时运行分配给该参数的回调,而 set_resize_callback
将在窗口被调整大小时运行,并且可以使用 handler
参数设置成任意窗口,默认值为 主窗口。
另外,如果你希望每帧都执行一次回调,则可以使用 set_render_callback
方法。
from dearpygui.core import *
from dearpygui.simple import *
add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')
def close_me(sender, data):
log_debug(f"{sender} 窗口已经关闭")
def render_me(sender, data):
log_debug(f"窗口 {sender} 运行了 set_render 回调")
def resize_me(sender, data):
log_debug(f"窗口 {sender} 运行了 set_resize 回调")
show_logger() # 使用logger窗口显示结果
with window("Tester", on_close=close_me):
add_text('调整此窗口的大小将触发 set_resize 回调')
add_text('关闭此窗口将触发 close 回调')
# logger窗口狂刷:[x.xx] [DEBUG] 窗口 Main Application 运行了 set_render 回调
# set_render_callback(render_me)
set_resize_callback(resize_me, handler="Tester")
start_dearpygui()
dearpygui_setrendercallback.png
运行时添加和删除控件
Dear PyGui 支持在运行时动态添加和删除任何控件或窗口,通过使用回调运行所需控件的 add_***
方法并指定该控件所属的 parent
来完成,默认情况下,如果未指定 parent
,则将控件添加到主窗口。
而通过在添加控件时使用 before
参数,可以设置将新控件放在哪个控件之前,默认情况下,会将新控件放在最后。
from dearpygui.core import *
from dearpygui.simple import *
def add_buttons(sender, data):
add_button("New Button 2", parent="Secondary Window")
add_button("New Button", before="New Button 2")
def delete_buttons(sender, data):
delete_item("New Button")
delete_item("New Button 2")
show_debug()
with window("Tutorial"):
add_button("Add Buttons", callback=add_buttons)
add_button("Delete Buttons", callback=delete_buttons)
with window("Secondary Window"):
pass
start_dearpygui()
dearpygui_deleteitem.png
删除窗口时,默认情况下,会删除窗口及其子控件,如果只想删除子控件,可以将 children_only
参数设置为 True 值。
from dearpygui.core import *
from dearpygui.simple import *
add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')
def add_widgets(sender, data):
with window("Secondary Window"):
add_button("New Button 2")
add_button("New Button")
add_button("New Button 3", parent="Secondary Window")
def delete_widgets(sender, data):
delete_item("Secondary Window")
def delete_children(sender, data):
delete_item("Secondary Window", children_only=True)
show_debug()
with window("Tutorial"):
add_button("添加窗口以及控件", callback=add_widgets)
add_button("删除窗口以及子控件", callback=delete_widgets)
add_button("删除窗口的子控件", callback=delete_children)
start_dearpygui()
dearpygui_childrenonly.png
值与数据存储
添加新的窗口控件时,会将 value
添加到 Value存储系统 中,默认情况下,此 value
的标识符是控件的 name
。我们可以使用 source
参数覆盖标识符,这样做有一个好处,就是让多个控件控制同一个 value
。
- 使用
get_value
从 Value存储系统 中检索value
- 使用
set_value
可以手动更改value
为了使不同 value
类型的控件在 Value存储系统 中使用相同的值,必须先创建较大的 value
。例如,当创建一个 input_float3 控件时,存储的 value
类型为 [float, float, float],后来创建的 input_float2 可以使用与 input_float3 相同的 source
值。
但是,如果先创建了 input_float2,然后尝试与 input_float3 共享其 source
值,则不起作用。为了使 input_float3 和 input_float2 共享相同的 source
值,我们首先需要创建 input_float3,这可以通过add_value()
方法完成。
from dearpygui.core import *
from dearpygui.simple import *
add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')
def print_me(sender, data):
log_debug(f"复选框—value: {get_value('value_1')}")
log_debug(f"文本—value: {get_value('value 2')}")
log_debug(f"颜色—value: {get_value('color4')}")
def reset(sender, data):
set_value("value_1", False)
set_value("value 2", "Hello DearPyGui!")
show_logger()
with window("Tutorial"):
add_checkbox("单选框 1", source="value_1")
add_checkbox("单选框 2", source="value_1")
add_input_text("文本输入 1", source="value 2")
add_input_text("文本输入 2", source="value 2", password=True, tip="此文本框已隐藏密码")
add_button("打印 source value", callback=print_me)
add_button("重置 source value", callback=reset)
# 将较小的输入类型的控件链接到较大的控件时的特殊情况,首先创建较大的值
add_value("color4", (0.0, 0.0, 0.0, 0.0))
add_color_edit3("颜色选择 3", source="color4")
add_color_edit4("颜色选择 4", source="color4")
start_dearpygui()
dearpygui_sourceaddvalue.png
Dear PyGui 还支持传入任意 Python 数据对象类型(甚至可以自定义数据类型)用于数据存储。使用 add_data
,我们可以传入任意数据类型,并通过 get_data("name")
进行访问。
from dearpygui.core import *
from dearpygui.simple import *
add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')
def store_data(sender, data):
custom_data = {
"Radio Button": get_value("Radio Button"),
"Checkbox": get_value("Checkbox"),
"Text Input": get_value("Text Input"),
}
add_data("stored_data", custom_data)
def print_data(sender, data):
log_debug(get_data("stored_data"))
show_logger()
with window("Tutorial"):
add_radio_button("Radio Button", items=["选项1", "选项2"])
add_checkbox("Checkbox", label="复选框")
add_input_text("Text Input", label="文本输入")
add_button("存储数据", callback=store_data)
add_button("打印数据", callback=print_data)
start_dearpygui()
dearpygui_adddata.png
网友评论