美文网首页
Python DearPyGui 进阶

Python DearPyGui 进阶

作者: 何小有 | 来源:发表于2020-11-02 20:09 被阅读0次

控件和窗口回调

每个输入控件都有一个回调,该回调在控件交互时运行,回调用于为控件提供功能实现。回调可以在创建时或在创建后使用 set_item_callback 分配给窗口控件。

DearPyGui 中,应用于控件的每个回调方法都必须包含一个 senderdata 参数。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_valueValue存储系统 中检索 value
  • 使用 set_value 可以手动更改 value

为了使不同 value 类型的控件在 Value存储系统 中使用相同的值,必须先创建较大的 value。例如,当创建一个 input_float3 控件时,存储的 value 类型为 [float, float, float],后来创建的 input_float2 可以使用与 input_float3 相同的 source 值。

但是,如果先创建了 input_float2,然后尝试与 input_float3 共享其 source 值,则不起作用。为了使 input_float3input_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

相关文章

网友评论

      本文标题:Python DearPyGui 进阶

      本文链接:https://www.haomeiwen.com/subject/hdwmvktx.html