使用 QPixmap 创建 QLabel 的一个班轮
Posted
技术标签:
【中文标题】使用 QPixmap 创建 QLabel 的一个班轮【英文标题】:One liner to create QLabel with QPixmap 【发布时间】:2016-02-20 16:16:20 【问题描述】:使用我当前使用的 QPixmap 创建 QLabel
label = QLabel()
label.setPixmap(QPixmap("path-to-img"))
所以它是 2 行。但我想要一个班轮代码。
我认为下面的代码可能是一个答案。
label = QLabel("<img src=path-toimg></img>")
但我怀疑还有更优雅的方式。
【问题讨论】:
第一个代码有什么问题? @cdonts: 没有问题,除了是 2 行。QLabel
构造函数不接受pixmap
参数,因此可能没有其他方法。你仍然可以写一行label = QLabel(); label.setPixmap(QPixmap("path-to-img"))
。为什么要一个班轮代码?
写一个辅助函数接受一个QPixmap,返回一个QLabel?
img 标签单行有效,那你为什么不使用它呢?根据定义,没有优雅的方式来玩代码高尔夫,这就是您的全部问题。
【参考方案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])
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
语句。
【讨论】:
嗯,很复杂……但我明白你的意思。你使用lambda
就像 lisp 的 (prongn ...)
。非常棘手,但毫无疑问,一个班轮。
狡猾,肮脏,而不是pythonic。但是,据我所知,没有其他方法可以在没有额外的 def
函数的情况下在一行中完成所有这些操作,这会增加更多的行。 :D 顺便说一句,这里的非 Python 部分是这样的事实 - 正如我所提到的 - 与 Lisp
或 Haskell
不同,Python 对函数式编程的支持很糟糕。不要问我为什么,但是该语言的作者不想添加多表达式支持。事实上,甚至有一段时间他想放弃整个 lambda
以支持 Python 3(Python 2.7 中也提供了 lambda;不确定早期版本)。以上是关于使用 QPixmap 创建 QLabel 的一个班轮的主要内容,如果未能解决你的问题,请参考以下文章