使用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
相关产品推荐
相关产品推荐

