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

使用lambda调用带参函数时传入索引而非对应项的问题求助

问题原因

DearPyGui的控件回调触发时会自动传入2个固定位置参数:第一个是触发回调的控件ID(sender),第二个是控件关联的临时数据(app_data,按钮场景下一般为None),如果你没有手动声明接收这两个参数,你通过lambda默认参数绑定的循环变量会被自动传入的sender值覆盖,导致打印出来的是数值类型的控件ID而非你期望的小写字母。

解决方案

提供两种可行的修改方式:

方式1:使用DearPyGui原生的user_data传参

直接把要传递的字母通过user_data参数传入,回调函数直接读取第三个参数即可,无需额外写lambda:

# pip install dearpygui
import dearpygui.dearpygui as dpg
import string

dpg.create_context()

# 回调函数新增dpg默认传入的前两个参数,第三个为自定义user_data
def my_func_2(sender, app_data, x):
    print(x)


def my_func():
    x = list(string.ascii_lowercase)
    with dpg.window(label="Test window 2"):
        for i in x:
            # 通过user_data传值,不需要额外写lambda
            dpg.add_button(label=i, callback=my_func_2, user_data=i)


with dpg.window(label="Test window"):
    dpg.add_button(label='Click Me!', callback=my_func)

dpg.create_viewport(title='Test')
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

方式2:lambda先接收dpg的默认参数再传自定义值

如果不想修改原有my_func_2的参数定义,可以在lambda里先接住dpg自动传入的两个参数,再使用默认参数绑定循环变量:

# pip install dearpygui
import dearpygui.dearpygui as dpg
import string

dpg.create_context()


def my_func_2(x):
    print(x)


def my_func():
    x = list(string.ascii_lowercase)
    with dpg.window(label="Test window 2"):
        for i in x:
            # lambda前两个参数接住dpg自动传入的sender和app_data,再使用绑定的i值
            dpg.add_button(label=i, callback=lambda sender, app_data, i=i: my_func_2(i))


with dpg.window(label="Test window"):
    dpg.add_button(label='Click Me!', callback=my_func)

dpg.create_viewport(title='Test')
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

内容的提问来源于stack exchange,提问作者progress456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:48:02