项目回调¶
大多数项都有一个回调,该回调提交给 回调队列 当项目与之交互时。
回调用于为项提供功能。回调可以在创建时或在创建后使用 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()