控件和窗口回调
每个输入控件都有一个回调,该回调在控件交互时运行,回调用于为控件提供功能实现。回调可以在创建时或在创建后使用
在 DearPyGui 中,应用于控件的每个回调方法都必须包含一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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() |
每次与控件交互时,都可以使用回调来更新变量的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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() |
但是,上面的方法缺乏灵活性,无法实现通用的回调方法,下面是通过使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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() |
窗口以及窗口类型的控件具有特殊的回调,这些回调在特殊的事件(例如窗口大小调整、窗口关闭等)上触发。
另外,如果你希望每帧都执行一次回调,则可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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() |
运行时添加和删除控件
Dear PyGui 支持在运行时动态添加和删除任何控件或窗口,通过使用回调运行所需控件的
而通过在添加控件时使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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() |
删除窗口时,默认情况下,会删除窗口及其子控件,如果只想删除子控件,可以将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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() |
值与数据存储
添加新的窗口控件时,会将
- 使用
get_value 从 Value存储系统 中检索value - 使用
set_value 可以手动更改value
为了使不同
但是,如果先创建了 input_float2,然后尝试与 input_float3 共享其
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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() |
Dear PyGui 还支持传入任意 Python 数据对象类型(甚至可以自定义数据类型)用于数据存储。使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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() |