使用QPixmap创建QLabel的一个班轮

时间:2016-02-20 16:16:21

标签: python qt pyqt pyside

使用QPixmap创建QLabel我正在使用

label = QLabel()
label.setPixmap(QPixmap("path-to-img"))

所以它是2行。但我想要一个班轮代码。

我认为以下代码可能是一个答案。

label = QLabel("<img src=path-toimg></img>")

但我怀疑还有更优雅的方式。

1 个答案:

答案 0 :(得分:1)

好的,经过一些研究后你可以做到但是它被认为是非pythonic,因为我们滥用了tuple(你可以用listdict或任何其他对象来做可以存储多个值,您可以以一种体面的方式访问这些值。以下代码利用元组的评估顺序。它还使得不仅可以创建标签并为其分配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的问题在于它不允许在其正文中使用多个表达式。而表达式也是一个关键字 - 你不能使用语句!然而,我们可以做的是使用一连串的lambdas。上面的代码是有效的,因为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) - 我们将pixmap重定向并将对象标记为它(两者都作为引用传递)并调用QLabel.setPixmap(...)方法
  • 第二个内部lambda (lambda l: l)(lbl) - 这基本上只是重定向QLabel对象(已作为参数传递给外部lambda并由第一个内部lambda设置)这样 - 在访问我们返回的元组的[1]元素之后,我们实际上得到了一个我们可以使用的对象。

如果您想存储创建的标签,可以省略layout.addWidget(...),只需将lambda的结果分配给变量以供进一步使用。如果您使用[0]作为索引,则会得到None,因为第一个内部lambda 会返回None

再次 - 警告!这是 - 如上所述 - 滥用Python的工作方式。正如评论部分所建议的那样,您应该使用普通的def(命名函数)和return语句。