PyQt,Python 3:Lambda 插槽将信号参数分配给变量?
PyQt, Python 3: Lambda slot assigning signal argument to a variable?
假设以下 PyQt 信号:
value_changed = pyqtSignal(value)
有没有办法编写一个 lambda 槽,将信号提供的值分配给某个变量,如这个(显然是非法的)示例所示:
object1.value_changed.connect(lambda val: var1=val)
object2.value_changed.connect(lambda val: var2=val)
...
实现这种行为的最简洁方法是什么?我基本上想避免为每个这样的分配定义一个函数。
我认为您不能(或不应该)使用 lambda
执行此操作。请参阅 answer 到可能的重复项(我在你的问题下引用)以了解你可以做什么。
做类似事情的一种方法是简单地定义一个带有两个参数的函数。可用于在函数内查找变量的值和一些标识符(例如对象引用或字符串)。
我可能会建议:
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
的 class 的方法内进行的。您可以将 class 的方法定义为
def store_var(self, name, value):
setattr(self.data, name, value)
然后你会打电话给
object1.value_changed.connect(lambda val: self.store_var('var1', val))
假设以下 PyQt 信号:
value_changed = pyqtSignal(value)
有没有办法编写一个 lambda 槽,将信号提供的值分配给某个变量,如这个(显然是非法的)示例所示:
object1.value_changed.connect(lambda val: var1=val)
object2.value_changed.connect(lambda val: var2=val)
...
实现这种行为的最简洁方法是什么?我基本上想避免为每个这样的分配定义一个函数。
我认为您不能(或不应该)使用 lambda
执行此操作。请参阅 answer 到可能的重复项(我在你的问题下引用)以了解你可以做什么。
做类似事情的一种方法是简单地定义一个带有两个参数的函数。可用于在函数内查找变量的值和一些标识符(例如对象引用或字符串)。
我可能会建议:
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
的 class 的方法内进行的。您可以将 class 的方法定义为
def store_var(self, name, value):
setattr(self.data, name, value)
然后你会打电话给
object1.value_changed.connect(lambda val: self.store_var('var1', val))