使用QPixmap创建QLabel我正在使用
label = QLabel()
label.setPixmap(QPixmap("path-to-img"))
所以它是2行。但我想要一个班轮代码。
我认为以下代码可能是一个答案。
label = QLabel("<img src=path-toimg></img>")
但我怀疑还有更优雅的方式。
答案 0 :(得分:1)
好的,经过一些研究后你可以做到但是它被认为是非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])
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 img, lbl: ...)(QPixmap('../Pictures/IMAGE.jpg'), QLabel('Lambda'))[1]
- 此lambda会收到新创建的QPixmap
以及新创建的QLabel
。由于外部lambda返回一个元组(见下文),我们可以访问第二个元素(参见第二个内部lambda )(lambda i,l: l.setPixmap(i))(img,lbl)
- 我们将pixmap重定向并将对象标记为它(两者都作为引用传递)并调用QLabel.setPixmap(...)
方法(lambda l: l)(lbl)
- 这基本上只是重定向QLabel
对象(已作为参数传递给外部lambda并由第一个内部lambda设置)这样 - 在访问我们返回的元组的[1]
元素之后,我们实际上得到了一个我们可以使用的对象。如果您想存储创建的标签,可以省略layout.addWidget(...)
,只需将lambda
的结果分配给变量以供进一步使用。如果您使用[0]
作为索引,则会得到None
,因为第一个内部lambda 会返回None
。
再次 - 警告!这是 - 如上所述 - 滥用Python的工作方式。正如评论部分所建议的那样,您应该使用普通的def
(命名函数)和return
语句。