项目回调

大多数项都有一个回调,该回调提交给 回调队列 当项目与之交互时。

回调用于为项提供功能。回调可以在创建时或在创建后使用 set_item_callback 如下面的代码所示。

DPG中的回调最多可以有3个参数。第一个通常是触发回调的发送者或物品。第二种是DPG出于不同原因发送的数据。第三个保留用于用户指定的数据。我们将其概括地称为: 发件人app_data ,以及 user_data

备注

因为它们是可选的位置参数,所以必须使用 发件人app_data 如果您想使用 user_data 关键字参数:

发送方,App_Data

发件人:

参数被DPG用来通知回调是哪一项触发了回调,由应用程序发送标记或如果触发器为0。

APP_DATA:

参数被DPG用来向回调发送信息,即大多数基本小部件的当前值。

import dearpygui.dearpygui as dpg

dpg.create_context()

def button_callback(sender, app_data):
    print(f"sender is: {sender}")
    print(f"app_data is: {app_data}")

with dpg.window(label="Tutorial"):
    dpg.add_button(label="Print to Terminal", callback=button_callback)

dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

用户数据

用户数据(_D):

论据是 可选 用于将您自己的Python数据传递给该函数。

可以将Python数据分配或更新到关键字 user_data 在创建项时或创建项之后使用 set_item_user_data

用户数据可以是任何PYTHON对象。

import dearpygui.dearpygui as dpg

dpg.create_context()

def button_callback(sender, app_data, user_data):
    print(f"sender is: {sender}")
    print(f"app_data is: {app_data}")
    print(f"user_data is: {user_data}")

with dpg.window(label="Tutorial"):
    # user data set when button is created
    dpg.add_button(label="Print to Terminal", callback=button_callback, user_data="Some Data")

    # user data and callback set any time after button has been created
    dpg.add_button(label="Print to Terminal 2", tag="btn")
    dpg.set_item_callback("btn", button_callback)
    dpg.set_item_user_data("btn", "Some Extra User Data")

dpg.create_viewport(title='Custom Title', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

调试回调(1.2中的新功能)

因为回调不在主线程上运行,所以调试可能很麻烦。在1.2中,我们添加了一些实用程序来帮助实现这一点。

默认情况下,Dear PyGui在工作线程上处理内部回调。这允许优化和稳定的帧速率。但是,为了帮助调试,可以将新的 manual_callback_management 进入以下位置的关键字 True 使用 configure_app 。这将阻止Dear PyGui处理回调。相反,将存储回调和参数。然后,您可以通过调用 get_callback_queue 在您的主事件循环中。这将返回一个“作业”列表。“作业”只是一个列表,第一项是可调用的,其余项(最多3个)是典型的参数。我们还提供了 run_callbacks 正确处理作业,便于简单使用。

下面是一个简单的例子

import dearpygui.dearpygui as dpg

dpg.create_context()
dpg.configure_app(manual_callback_management=True)
dpg.create_viewport()
dpg.setup_dearpygui()

def callback(sender, app_data, user_data):
    print("Called on the main thread!")

with dpg.window(label="Tutorial"):
    dpg.add_button(label="Press me", callback=callback)


# main loop
dpg.show_viewport()
while dpg.is_dearpygui_running():
    jobs = dpg.get_callback_queue() # retrieves and clears queue
    dpg.run_callbacks(jobs)
    dpg.render_dearpygui_frame()

dpg.destroy_context()