You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 07:18:00