我有可以动态生成 PyQt5 应用程序设置页面的代码。我的问题是,当尝试连接到信号时,我需要使用 lambda 表达式,如本文的“循环问题”部分所述。但是,当我运行代码时,lambda 表达式中的第一个参数正在执行比较而不是赋值。下面是代码:
for key, setting in self.settings.items():
display = QHBoxLayout()
display.addWidget(QLabel(setting['label']))
constructor = globals()[setting['control']]
control = constructor()
control = set_widget_value(control, setting['value'])
signal_name = get_widget_signal(control)
if signal_name != None:
signal = getattr(control, signal_name)
slot = lambda control = control, key = key : self.update_settings(key, control)
signal.connect(slot)
display.addWidget(control)
layout.addLayout(display)
我希望 lambda 表达式的计算结果为:
self.update_settings('string', QObject)
但它实际评估的是:
self.update_settings('string', True)
就好像将赋值运算符作为比较运算符来处理一样。
我尝试了不同的语法,但得到了相同的结果。如果我交换 lambda 表达式中的控制参数和键参数,相反的参数将被计算为 True,因此传递到 lambda 表达式的第一个参数始终像比较运算符一样被计算。为了进行测试,我还创建了一个 args 对象并将其传递到 lambda 表达式中,但在像比较一样对其进行评估时发生了同样的问题。
args = {key , control}
slot = lambda args = args : self.update_settings(args)
signal.connect(slot)
syntax
时,就会出现问题,通常在创建 lambda 时进行计算,并且由于默认值被解释为布尔值,因此 lambda 中的第一个参数被视为比较,即 True .
话虽如此,您所需要做的就是更改顺序,但我希望:slot = lambda key=key, control=control: self.update_settings(key, control)