PyQt,Python 3:Lambda 槽将信号参数分配给变量?

And*_*bis 3 python pyqt python-3.x

假设以下 PyQt 信号:

value_changed = pyqtSignal(value)
Run Code Online (Sandbox Code Playgroud)

有没有办法编写一个 lambda 槽,将信号提供的值分配给某个变量,如这个(显然是非法的)示例所示:

object1.value_changed.connect(lambda val: var1=val) 
object2.value_changed.connect(lambda val: var2=val) 
...
Run Code Online (Sandbox Code Playgroud)

实现这种行为的最简洁的方法是什么?我基本上想避免为每个这样的分配定义一个函数。

thr*_*les 5

我认为您不能(或应该想要)使用lambda. 请参阅可能重复的答案(我在您的问题下引用)以了解您可以做什么。

执行类似操作的一种方法是简单地定义一个带有两个参数的函数。您可以使用该值和一些标识符来查找函数内的变量(例如对象引用或字符串)。

我可能会建议:

object1.value_changed.connect(lambda val: store_var('var1', val)) 
object2.value_changed.connect(lambda val: store_var('var2', val)) 
Run Code Online (Sandbox Code Playgroud)

当然,您的实现方式store_var()高度依赖于代码结构的其余部分,无论您是将值存储在字典中还是作为全局变量或实例属性。但是,如果您希望能够从表达式中访问存储位置,那么从函数中访问存储位置应该不会有任何问题lambda


更新

根据您的评论,我假设对该connect函数的调用位于包含data. 您可以将该类的方法定义为

def store_var(self, name, value):
    setattr(self.data, name, value)
Run Code Online (Sandbox Code Playgroud)

然后你会打电话

object1.value_changed.connect(lambda val: self.store_var('var1', val)) 
Run Code Online (Sandbox Code Playgroud)