PyQt可变数量Toggle绑定函数时所有开关都触发最后一个参数如何解决
问题原因
Python的lambda表达式采用迟绑定机制,闭包中引用的变量值会在lambda函数实际执行时才计算,而非lambda定义时。你在循环中绑定的所有lambda都引用了同一个gesture变量,循环结束后gesture已经被赋值为列表最后一个元素,所以所有开关触发时都会传入最后一个值。
修复方案
方案1:使用lambda默认参数捕获当前迭代值
默认参数会在函数定义时完成求值,把当前迭代的gesture值存为lambda的参数默认值,即可绑定到对应迭代的取值:
for gesture, toggle in self.gesture_toggle_list: print(gesture, str(toggle)) # 新增默认参数捕获当前gesture值,避免迟绑定问题 toggle.clicked.connect(lambda g=gesture: self.toggleGesture(g))
方案2:使用functools.partial绑定参数
functools.partial会在定义阶段就把传入的参数和目标函数绑定,不会出现迟绑定问题,代码可读性更高:
首先导入partial:
from functools import partial
修改绑定逻辑:
for gesture, toggle in self.gesture_toggle_list: print(gesture, str(toggle)) toggle.clicked.connect(partial(self.toggleGesture, gesture))
内容的提问来源于stack exchange,提问作者user11072370
相关产品推荐
相关产品推荐

