我尝试使用Python以编程方式将PyQt4中的QWidget保存为图像(任何格式都可以 - PNG,PDF,JPEF,GIF等)
我认为这会非常简单,但实际上我无法在网上找到任何关于它的内容。有人能指出我正确的方向吗?
要说清楚,我试图这样做
gui = <SOME QMainWindow>
gui.show() # this displays the gui. it's useful, but what i need is to save the image
gui.save("image.png") ## How do I do this?
答案 0 :(得分:8)
您可以使用QPixmap.grabWindow()
方法执行此操作。
来自文档:
抓取窗口窗口的内容并从中制作像素图。 返回像素图。
参数(x,y)指定窗口中的偏移量,而(w,h) 指定要复制的区域的宽度和高度。
如果w为负数,则该函数会将所有内容复制到右边框 的窗口。如果h为负数,则该函数将所有内容复制到 窗户的底部。
请注意,grabWindow()从屏幕抓取像素,而不是从屏幕抓取像素 窗口。如果另一个窗口部分或完全覆盖了另一个窗口 你抓住了,你也可以从上面的窗口获得像素。
另请注意,通常不会抓取鼠标光标。
我们使用窗口标识符而不是QWidget的原因是启用 抓住不属于应用程序窗口的窗口 系统框架,等等。
警告:抓住屏幕外的区域一般不安全。 这取决于底层窗口系统。
警告:仅限X11:如果窗口与根窗口的深度不同 和另一个窗口部分或完全掩盖你抓住的那个, 你不会从上面的窗口获得像素。比赛的 像素图中的模糊区域未定义且未初始化。
示例代码:
import sys
from PyQt4.QtGui import *
filename = 'Screenshot.jpg'
app = QApplication(sys.argv)
widget = QWidget()
widget.setLayout(QVBoxLayout())
label = QLabel()
widget.layout().addWidget(label)
def take_screenshot():
p = QPixmap.grabWindow(widget.winId())
p.save(filename, 'jpg')
widget.layout().addWidget(QPushButton('take screenshot', clicked=take_screenshot))
widget.show()
app.exec_()
这将生成一个如下所示的窗口:
单击该按钮时,它将在当前目录中创建名为Screenshot.jpg
的文件。所述图像将如下所示(注意窗框缺失):