好的,在做一些研究之后你可以做到,但它被认为是非 Pythonic,因为我们滥用了tuple(你可以用list、dict 或任何其他可以存储多个值的对象来做到这一点,并且您能够以体面的方式访问这些)。以下代码利用了元组的评估顺序。它不仅可以创建标签并为其分配QPixmap,还可以将其添加到布局中。正如所承诺的全部在一行中。 :D
layout.addWidget((lambda img, lbl: ((lambda i,l: l.setPixmap(i))(img,lbl), (lambda l: l)(lbl)))(QPixmap('../Pictures/IMAGE.jpg'), QLabel('Lambda'))[1])
lambda 在 Python 中的问题在于它的主体中不允许有多个表达式。表达式在这里也是一个关键字——你不能使用语句!然而,我们可以做的是使用一个 lambda 链。上面的代码之所以有效,是因为 lambda 总是返回一个值。
示例和解释为什么这样做:
>>> x = lambda x,y: (x**y, x+y)
返回一个元组。对元组中的每个元素进行评估,以便最终的元组可以由 lambda 表达式返回。这是一个如何工作的示例
>>> x(2,3)
(8,5)
第一个元组元素8 是通过评估x**y 创建的。第二个 - 5 - 是 x+y 的结果。
此外,我们可以引用元组的元素并返回存储在位置 X 的内容。如果我们从上面的数字示例中得到
>>> x(2,3)[0]
8
>>> x(2,3)[1]
5
这正是我们在这里所做的。
-
外部 lambda
(lambda img, lbl: ...)(QPixmap('../Pictures/IMAGE.jpg'), QLabel('Lambda'))[1] - 此 lambda 接收新创建的 QPixmap 以及新创建的QLabel。由于外部 lambda 返回一个元组(见下文),我们可以访问第二个元素(见 第二个内部 lambda)
-
第一个内部 lambda
(lambda i,l: l.setPixmap(i))(img,lbl) - 我们将像素图和标签对象重定向到它(两者都作为引用传递)并调用 QLabel.setPixmap(...) 方法
-
第二个内部 lambda
(lambda l: l)(lbl) - 这基本上只是重定向 QLabel 对象(已作为参数传递给外部 lambda 并由第一个内部 lambda 设置)以便 - 在访问 @我们返回的元组的 987654341@ 元素实际上得到了一个我们可以使用的对象。
如果您想存储创建的标签,您可以省略layout.addWidget(...),只需将lambda 的结果分配给变量以供进一步使用。如果您使用[0] 作为索引,您将获得None,因为第一个内部lambda 返回None。
再次 - 警告! 这是 - 如上所述 - 滥用 Python 的工作方式。正如评论部分所建议的,您应该使用普通的def(命名函数)和return 语句。