【问题标题】:PyQt, Python 3: Lambda slot assigning signal argument to a variable?PyQt,Python 3:将信号参数分配给变量的 Lambda 插槽?
【发布时间】:2015-08-19 22:42:20
【问题描述】:

假设以下 PyQt 信号:

value_changed = pyqtSignal(value)

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

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

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

【问题讨论】:

标签: python python-3.x pyqt


【解决方案1】:

我认为您不能(或不应该)使用lambda 来做到这一点。请参阅answer 到可能的重复项(我在您的问题下引用)以了解您可以做什么。

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

我可能会建议:

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

您如何实现store_var() 当然高度依赖于yoru 代码结构的其余部分,无论您是将值存储在字典中还是作为全局变量或实例属性。但是,如果您希望能够从 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 访问,您建议如何实现该功能?
  • @three_pineapples。 hasattr 的使用是多余的,不能分配给函数调用。我假设您的意图更像是:lambda val: setattr(self.data, 'var1', val).
猜你喜欢
  • 2012-07-13
  • 2010-10-30
  • 2011-11-23
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2011-08-08
  • 2020-09-21
相关资源
最近更新 更多