使用 QPixmap 创建 QLabel 的一种方式
One liner to create QLabel with QPixmap
要使用我目前正在使用的 QPixmap 创建 QLabel
label = QLabel()
label.setPixmap(QPixmap("path-to-img"))
所以是2个lines.But我要一个班轮码
我认为下面的代码可能是一个答案。
label = QLabel("<img src=path-toimg></img>")
但我怀疑还有更优雅的方法。
好的,经过一些研究你可以做到,但它被认为是非 Python 的,因为我们滥用了 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])
Python 中 lambda
的问题在于它不允许在其主体中使用多个表达式。表达式也是这里的关键字 - 你不能使用语句!然而,我们可以做的是使用一个 lambda 链。上面的代码之所以有效,是因为 lambda 总是 return 一个值。
示例和解释为何如此有效:
>>> x = lambda x,y: (x**y, x+y)
returns 一个元组。对元组内的每个元素进行求值,以便最终的元组可以由 lambda 表达式 returned。这是一个如何工作的例子
>>> x(2,3)
(8,5)
第一个元组元素 8
是通过计算 x**y
创建的。第二个 - 5
- 是 x+y
.
的结果
此外,我们还利用了这样一个事实,即我们可以引用元组的元素和 return 存储在位置 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 return 是一个元组(见下文),我们可以访问第二个元素(见 second inner lambda)
- 第一个内部 lambda
(lambda i,l: l.setPixmap(i))(img,lbl)
- 我们将像素图和标签对象重定向到它(两者都作为引用传递)并调用 QLabel.setPixmap(...)
方法
- 第二个内部 lambda
(lambda l: l)(lbl)
- 这基本上只是重定向 QLabel
对象(已作为参数传递给外部 lambda 并由第一个内部 lambda) 以便 - 在访问我们 returned 元组的 [1]
元素之后,我们实际上得到了一个我们可以使用的对象。
如果您想存储创建的标签,您可以省略 layout.addWidget(...)
并简单地将 lambda
的结果分配给一个变量以供进一步使用。如果您使用 [0]
作为索引,您将得到一个 None
,因为 第一个内部 lambda returns None
.
再次 - 警告! 这是 - 如上所述 - 滥用 Python 的工作方式。正如评论部分所建议的那样,您应该使用带有 return
语句的普通 def
(命名函数)。
要使用我目前正在使用的 QPixmap 创建 QLabel
label = QLabel()
label.setPixmap(QPixmap("path-to-img"))
所以是2个lines.But我要一个班轮码
我认为下面的代码可能是一个答案。
label = QLabel("<img src=path-toimg></img>")
但我怀疑还有更优雅的方法。
好的,经过一些研究你可以做到,但它被认为是非 Python 的,因为我们滥用了 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])
Python 中 lambda
的问题在于它不允许在其主体中使用多个表达式。表达式也是这里的关键字 - 你不能使用语句!然而,我们可以做的是使用一个 lambda 链。上面的代码之所以有效,是因为 lambda 总是 return 一个值。
示例和解释为何如此有效:
>>> x = lambda x,y: (x**y, x+y)
returns 一个元组。对元组内的每个元素进行求值,以便最终的元组可以由 lambda 表达式 returned。这是一个如何工作的例子
>>> x(2,3)
(8,5)
第一个元组元素 8
是通过计算 x**y
创建的。第二个 - 5
- 是 x+y
.
此外,我们还利用了这样一个事实,即我们可以引用元组的元素和 return 存储在位置 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 return 是一个元组(见下文),我们可以访问第二个元素(见 second inner lambda) - 第一个内部 lambda
(lambda i,l: l.setPixmap(i))(img,lbl)
- 我们将像素图和标签对象重定向到它(两者都作为引用传递)并调用QLabel.setPixmap(...)
方法 - 第二个内部 lambda
(lambda l: l)(lbl)
- 这基本上只是重定向QLabel
对象(已作为参数传递给外部 lambda 并由第一个内部 lambda) 以便 - 在访问我们 returned 元组的[1]
元素之后,我们实际上得到了一个我们可以使用的对象。
如果您想存储创建的标签,您可以省略 layout.addWidget(...)
并简单地将 lambda
的结果分配给一个变量以供进一步使用。如果您使用 [0]
作为索引,您将得到一个 None
,因为 第一个内部 lambda returns None
.
再次 - 警告! 这是 - 如上所述 - 滥用 Python 的工作方式。正如评论部分所建议的那样,您应该使用带有 return
语句的普通 def
(命名函数)。