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

3
假设有以下PyQt信号:
value_changed = pyqtSignal(value)

有没有一种方法可以编写 lambda 槽,将由信号提供的值分配给特定变量,就像这个(显然是非法的)示例中所示:

object1.value_changed.connect(lambda val: var1=val) 
object2.value_changed.connect(lambda val: var2=val) 
...

什么是实现这种行为最简明的方式?我基本上想避免为每个这样的赋值定义一个函数。

可能是Python中lambda表达式内部的赋值的重复问题。 - undefined
1个回答

5

我认为你不能(也不应该想要)使用 lambda 来做这件事。请查看我在你提出的问题下引用的可能重复的答案,以了解你可以做什么。

做类似事情的一种方法是简单地定义一个接受两个参数的函数。 值和一些标识符,你可以在函数内部使用它来查找变量(例如对象引用或字符串)。

我建议:

object1.value_changed.connect(lambda val: store_var('var1', val)) 
object2.value_changed.connect(lambda val: store_var('var2', val)) 

实现store_var()的方式取决于你代码结构的其他部分,无论你想将值存储在字典中还是作为全局变量或实例属性。但是如果你希望能够从lambda表达式中访问这些存储位置,那么你在函数内部访问存储位置不应该有任何问题。

更新

根据您的评论,我假设对connect函数的调用在包含data的类的方法中。那么你可以定义那个类的一个方法:

def store_var(self, name, value):
    setattr(self.data, name, value)

然后你将会调用

object1.value_changed.connect(lambda val: self.store_var('var1', val)) 

谢谢,如果我想要分配的变量是类的成员,并通过self.data.var1访问,你会如何建议实现这个函数? - undefined
@three_pineapples。使用hasattr是多余的,并且你不能将函数调用赋值给变量。我猜你的意图更像是:lambda val: setattr(self.data, 'var1', val) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接