DearPyGui中如何通过user_data将Python对象(列表索引)传递给回调函数?
DearPyGui中如何通过user_data将Python对象(列表索引)传递给回调函数?
嗨,我看你在DearPyGui里用user_data传递列表索引时踩坑了——明明设置的是index,结果回调里拿到的却是按钮标签,这其实是回调函数的参数签名没搞对哦!
问题根源
DearPyGui的回调函数有固定的参数顺序:
- 第一个参数sender:触发回调的控件(也就是你这里的按钮标签,比如
add_btn_0) - 第二个参数user_data:你设置的自定义数据
- 第三个参数(可选)app_data:控件自带的额外数据(比如滑块的当前值)
你写的add_something(user_data)只定义了一个参数,这时候它接收的其实是sender,而不是你设置的user_data,自然就打印出按钮标签啦!
修正方案
1. 调整回调函数的参数签名
把回调函数改成下面这样,就能正确接收sender和user_data了:
def add_something(sender, user_data): print(f"触发按钮标签: {sender}, 传递的索引: {user_data}")
2. 简化控件创建代码
其实不用分开调用dpg.set_item_callback和dpg.set_item_user_data,在创建按钮的时候直接指定callback和user_data参数会更简洁,还不容易出错:
import dearpygui.dearpygui as dpg def add_something(sender, user_data): print(f"触发按钮标签: {sender}, 传递的索引: {user_data}") N = 3 # 示例值 dpg.create_context() dpg.create_viewport(title='测试回调传参', width=400, height=200) with dpg.window(label='主窗口'): for index in range(N): with dpg.group(horizontal=True): # 直接在add_button里指定回调和user_data dpg.add_button(label="add", tag=f"add_btn_{index}", callback=add_something, user_data=index) dpg.setup_dearpygui() dpg.show_viewport() dpg.start_dearpygui() dpg.destroy_context()
额外技巧:传递多个参数
如果需要传递多个数据,直接把user_data设为元组、列表或者字典就行:
# 传递元组 dpg.add_button(label="add", tag=f"add_btn_{index}", callback=add_something, user_data=(index, "自定义文本")) # 回调里解包 def add_something(sender, user_data): idx, text = user_data print(f"索引: {idx}, 文本: {text}")
这样修改后,点击按钮就能正确拿到你想要的列表索引啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

