8

我正在尝试使用 linux 上的 python 脚本截取当前窗口的屏幕截图。

我目前有一个脚本可以截取整个屏幕的截图:

import sys
from PyQt4.QtGui import QPixmap, QApplication
from datetime import datetime

date = datetime.now()
filename = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
app = QApplication(sys.argv)
QPixmap.grabWindow(QApplication.desktop().winId()).save(filename, 'jpg')

但是一个想只有选定的窗口。我知道问题来自grabWindow。但我不知道如何解决它。

4

4 回答 4

9

只需更换

QApplication.desktop()

使用您要截取屏幕截图的小部件。

import sys
from PyQt4.QtGui import *
from datetime import datetime

date = datetime.now()
filename = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
app = QApplication(sys.argv)
widget = QWidget()
# set up the QWidget...
widget.setLayout(QVBoxLayout())

label = QLabel()
widget.layout().addWidget(label)

def shoot():
    p = QPixmap.grabWindow(widget.winId())
    p.save(filename, 'jpg')
    label.setPixmap(p)        # just for fun :)
    print "shot taken"

widget.layout().addWidget(QPushButton('take screenshot', clicked=shoot))

widget.show()
app.exec_()
于 2012-05-22T16:26:17.403 回答
7

从 Qt5 开始,grabWindow并且grabWidget已经过时(参见QPixmap 的过时成员

相反,您可以使用QWidget.grab()

p=widget.grab()
于 2015-10-12T08:00:45.673 回答
0

或者,而不是

p = QPixmap.grabWindow(widget.winId())

你也可以使用

p = QPixmap.grabWidget(widget)
于 2014-08-06T10:43:52.330 回答
0

PyQt5更新

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QPixmap, QScreen
from datetime import datetime

date = datetime.now()
filename = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
app = QApplication(sys.argv)
QScreen.grabWindow(app.primaryScreen(), 
QApplication.desktop().winId()).save(filename, 'png')
于 2020-02-01T19:45:13.713 回答